Rust 입문

[Rust] Method

바로크냥 2022. 10. 7. 00:52

3. Method

struct와 enum은 객체가 사용할 수 있는 함수인 메소드를 정의할 수 있습니다.

 대부분의 다른 언어에서는 메소드가 클래스나 구조체의 정의 구현부 내에 프로퍼티(또는 멤버)들과 같은 공간에 정의 됩니다.

하지만 Rust에서는 메소드의 구현부가 구조체/열거형의 정의부 밖에 따로 존재합니다. 

다음과 같은 형식으로 정의합니다.

impl 구조체/열거형 이름 {
  fn 메소드 이름 (&self, 파라미터) -> 반환 타입{
   ...
  }
}

impl 블록 안에 여러개의 메소드를 정의할 수 있습니다.

메소드의 정의는 함수를 정의하는 것과 동일합니다.

 다만 첫번째 파라미터는 반드시 ‘&self’입니다. 

‘&self’는 객체 자기 자신을 참조한다는 의미 입니다.

즉 객체에 종속된 함수라는 의미가 됩니다.

또 이 파라미터 때문에 메소드 내에서 객체에 속한 필드값들을 self 키워드를 통해 사용할 수 있게 됩니다. 

앞서 만든 People 타입에 메소드를 추가해 보겠습니다.

 

#[derive(Debug)]      // 객체를 출력하기 위해 첨가
struct People {
    name: String,
    age: u32,
    job: String,
}

// 1 People의 메소드를 추가
impl People{
   // 2 첫번째 메소드
    fn show_me(&self){
        println!("{:#?}", self);
    }  
   // 3 두번째 메소드
    fn live_n_year(&mut self, n:u32) -> &mut People {
        self.age += n;     // self.age 값을 n만큼 증가
        self               // 객체 자신을 반환
    }
}

fn main() {
    // People 타입 객체 만들기
    let mut man1 = People {
        name: String::from("Jane"),
        age: 12,
        job: String::from("student"),
    };
   man1.show_me();   // println! 메크로 대신 사용
    // 필드값 변경
    man1.name = "John".to_string();
    man1.age = 33;
    man1.job = "programmer".to_string();
    man1.show_me();     // println! 메크로 대신 사용
    man1.live_n_year(5);     // live_n_year 메소드 사용
    man1.show_me();
}

// 출력
People {
    name: "Jane",
    age: 12,
    job: "student",
}

People {
    name: "John",
    age: 33,
    job: "programmer",
}

People {
    name: "John",
    age: 38,
    job: "programmer",
}

// 1: impl 안에는 개의 메소드가 정의되어 있습니다.

모두 &self 파라미터로 시작합니다.

 

// 2: live_n_year 메소드는 n:u32 파라미터도 가지고 있고 반환형도 있습니다.

 

// 3: live_n_year 반환형은 People 타입의 참조 형입니다. 여기서는 변화된 필드값을 가지는 객체 자신을 반환합니다. 

live_n_year 메소드의 정의 영역 마지막줄은 반환값인데 self라고 선언 되어서 객체 자기 자신을 반환하고 있습니다.

self 뒤에 “;’ 없다는 점에 유의 하십시오. “;” 없는 함수 몸체의 마지막줄은 반환되는 값입니다. 

메소드의 첫번째 파라미터는 &self 아니라 &mut self입니다.

&self 같은 기능인데 다만 self 값이 바뀔 있도록 허용한다는 의미입니다.

 

 
 
 
 
반응형