본문 바로가기
Language/Rust

일반화된 자료구조와 함수

by y.j 2021. 10. 10.
728x90

다형성

일반적인 타입으로 매개변수 화 할 수 있어 여러 구체화된 정의를 갖을 수 있다.

struct Pair<T> {
      first: T,
      second: T
}

위의 코드 예제를 보면 T부분에 int, str 어떤 것이 와도 상관이 없다. 이를 제네릭 함수라고 부른다.

let magic_pair: Pair<u32> = Pair { first: 7, second: 42 };
let pair_of_magicians: Pair<&str> = Pair { first: "Gandalf", second: "Sauron" };

일반화 된 만큼 함수의 일반화도 중요하다.

fn second<T>(pair: Pair<T>) {
  pair.second;                      // 2번째 인수를 꺼내는 함수
}

let a = second(magic_pair);         // 호출

오류처리

스레드가 모든 리소스를 해제하고 메시지를 보고한 뒤 프로그램을 종료시켜준다.
Panic! : 조건이 일 경우 발생

if (y == 0) { panic!("Division by 0 occurred, exiting"); }

assert! : 조건이 참이 아닐 경우 발생

assert!( x == 5, "x is not equal to 5!");
assert_eq!(x, 5);

구조체에서의 메서드

impl 블록을 통해 구조체의 메서드를 정의 할 수 있다.

struct Alien {
    health: u32,
    damage: u32
}

impl Alien {
    fn new(mut h: u32, d: u32) -> Alien {
        // 제약사항
        if h > 100 { h = 100; }
        Alien { health: h, damage: d }
    }
}

let mut berserk = Alien::new(150, 15);        // 호출

struct 이름과 impl 이름을 똑같이 하면 구조체의 인스턴스들을 가져와 self키워드를 통해 사용할 수 있다.

fn attack(&self) { // &mut self
    println!("I attack! Your health lowers with {} damage points.", self.damage);
}

트레잇

인터페이스나 슈퍼 클래스와 유사하다
아래와 같은 코드에서 attack메서드를 정의하지 않으면 오류 메시지를 발생시킨다.

trait Monster {
    fn attack(&self);
}

impl Monster for Zombie {

}

#[derive(Debug)] : 오버라이딩되지 않은 메서드의 기본 코드가 자동으로 생성된다.

#[derive(Debug)]
struct Zombie { health: u32, damage: u32 }

트레잇 상수 사용하기

728x90

'Language > Rust' 카테고리의 다른 글

고차원 함수와 매개변수화를 통한 코드 일반화  (0) 2021.10.09
패턴매칭  (0) 2021.10.08
데이터 구조화  (0) 2021.10.06
함수와 제어문  (0) 2021.10.06
변수  (0) 2021.10.04

댓글