[Rust] Method
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의 값이 바뀔 수 있도록 허용한다는 의미입니다.