메서드


메서드는 함수와 비슷하지만 염연히 구분됨. 쉽게 말해서, 특정 타입에 종속되어서 해당 타입의 런타임 인스턴스와 관련된 기능을 제공하는 것이 메서드이고, 특정 타입에 종속되지 않는 기능을 하는 것이 함수임. 쉬운 예로 유틸성 기능은 보통 특정 타입과 관련되지 않고 범용적으로 사용되기 때문에 함수로 구현됨.



메서드 정의


이전 글의 예제에 메서드를 추가해봄.


#[derive(Debug)]
struct Rectangle {
width: u32,
height: u32,
}

impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}
}

fn main() {
let rect1 = Rectangle{width: 30, height: 50};

println!("The area of the rectangle is {} square pixels.", rect1.area());
}

이제 area 함수는 Rectangle 타입의 메서드가 되었음. 


메서드는 타입 이름 앞에 impl 키워드를 이용하여 정의됨. impl 블록은 편의에 따라 몇 개든 사용 가능. impl 블록마다 다른 메서드를 정의하는 것도 가능함.


메서드 정의 코드는 함수와 유사한데, 메서드의 특징은 첫 번째 파라미터로 &self 를 받음. 이 self 란 이 타입의 인스턴스 자신을 의미함. 내부적으로 메서드를 호출하면서 호출 주체인 인스턴스 자신을 넘기는 구조이기 때문. 기능을 수행하는 데에 필요한 파라미터가 없더라도 이 &self 는 반드시 필요함. 


&self 에 & 가 필요한 이유는 오너십의 규칙이 여기에도 적용되기 때문. & 를 빼고 self 로 정의하면 area 메서드 호출 시 인스턴스 자신의 오너십을 잃어버려, rect1 은 더 이상 사용할 수 없음.


그리고, 메서드가 인스턴스의 필드값을 변경하는 경우 &mut self 로 정의되어야 함.


impl Rectangle {
fn area(&self) -> u32 {
self.width * self.height
}

fn changeValues(&mut self, width: u32, height: u32){
self.width = width;
self.height = height;
}
}

fn main() {
let mut rect1 = Rectangle{width: 30, height: 50};

rect1.changeValues(300, 500);

println!("The area of the rectangle is {} square pixels.", rect1.area());
}

changeValues 는 필드의 값을 변경함. &mut self 로 정의되었으며, rect1 역시 뮤터블이어야 함.


메서드에 self 가 사용되는 경우도 있는데, 이는 주로 인스턴스를 다른 곳으로 이동시키고 기존 변수를 사용하지 못하게 하는 경우임.



Associated Function 


아래와 같이 impl 블록에 정의되는 함수를 associated function 이라 함. 인스턴스를 생성하지 않고 사용할 수 있으며, 특정 인스턴스와 관련되지 않고 해당 구조체와 관련된 것이기 때문에 메서드가 아니라 함수로 불림. 대표적인 예로 지금까지 사용된 String::from 이 associated function 임. (그 정의와 용례에 따르면, 자바의 스태틱 메서드라 이해하면 되지 않을까 조심스레 생각됨)


Associated function 의 주 사용처 중 하나는, 새로운 인스턴스를 편하게 생성하는 기능을 제공할 때임. 그 예는 아래와 같음.


impl Rectangle {
fn square(size: u32) -> Rectangle {
Rectangle {width: size, height: size}
}
}

fn main() {
let mut rect1 = Rectangle::square(30);

println!("The area of the rectangle is {} square pixels.", rect1.area());
}




'Rust' 카테고리의 다른 글

Enum(Option<T>)  (0) 2018.02.21
Enum  (0) 2018.02.21
구조체(활용)  (0) 2018.02.20
구조체(기본)  (0) 2018.02.19
오너십(슬라이스)  (0) 2018.02.17

+ Recent posts