Rust 공식 문서를 참고한 글입니다.
메서드
메서드는 함수와 유사하게 파라미터를 가지면서 값을 반환할 수 있고 호출되면 그에 해당하는 동작을 할 수 있다. 그러나 메서드는 구조체의 context 안에 선언되고 첫 파라미터는 항상 self여야 한다. 약간 어려우니까 실제 예제를 통해서 이해해보자.
#[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()
);
}
앞서, 메서드는 구조체 안에 선언된다고 했다. impl라는 것으로 Rectangle 구조체를 선언했고 이는 Rectangle 구조체와 항상 연관성을 가진다. 파라미터를 보면 &self로 선언했다. 이때 소유권은 main에서 가지기 때문에 &를 붙여 사용하고, 가변성을 가지게 하려면 mut과 함께 사용하면 된다.
소유권을 가지는 메서드는 거의 드물다. self를 사용해서 메서드를 호출하면 구조체 인스턴스에 대한 소유권을 잃는다. 일반적으로 메서드 호출 후에도 구조체 인스턴스를 사용할 수 있어야 하기 때문에, self보다는 &self, &mut self를 사용하는 것이다. 메서드를 사용할 때는 변수 이름.메서드명();으로 호출할 수 있다.
연관 함수
impl 안의 함수는 연관 함수라고 한다. impl 로 만들어진 함수는 구조체와 연관성을 갖기 때문이다. 우리는 인스턴스를 사용하지 않을 수도 있기 때문에, 연관함수의 첫 파라미터로 self를 갖지 않도록 만들 수도 있다.
메소드가 아닌 연관함수는 constructors와 함께 사용되고 새로운 인스턴스를 반환한다. 예를 들어서, 면적에 대한 파라미터를 가지고 있는 square라는 연관함수가 있다고 하자. 우리는 width와 height를 사용할 것이기 때문에 Rectangle이라는 구조체로 두 변수를 하나로 묶는 게 편하고 보기 쉽다.
impl Rectangle {
fn square(size: u32) -> Self {
Self {
width: size,
height: size,
}
}
}
'언어 > Rust' 카테고리의 다른 글
[Rust] 7. 프로젝트 관리 (1) | 2024.10.09 |
---|---|
[Rust] 6. 열거형과 패턴 매칭 (8) | 2024.10.09 |
[Rust] 5-1. 구조체 사용 (0) | 2024.10.09 |
[Rust] 4-3. Slice Type (0) | 2024.09.28 |
[Rust] 4-2. 참조와 대여 (0) | 2024.09.28 |