[Rust] Struct method

silver·2023년 4월 28일
0

메소드 문법

메소드(method)는 함수와 유사하다. 하지만 메소드는 함수와는 달리 구조체의 내용 안에 정의되며 (혹은 열거형이나, 트레잇 객체 안에), 첫번째 파라미터가 언제나 self인데, 이는 메소드가 호출되고 있는 구조체의 인스턴스를 나타낸다.

메소드 정의하기

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

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

fn main() {
	let rect1 = Rectangle { length: 50, width: 30 };
    
    println! (
    	"The area of the rectangle is {} square pixels.",
        rect1.area()
    );
}

area의 시그니처 내에서는 rectangle: &Rectangle 대신 &self가 사용되었다. 이는 메소드가 impl Rectangle 내에 위치하고 있어 러스트가 self의 타입이 Rectangle이라는 사실을 알 수 있기 때문이다. 우리가 &Rectangle이라고 썻던 것처럼, self앞에도 여전히 &를 쓸 수 있다. 메소드는 self의 소유권을 가져갈수도, 변경 불가능하게 빌릴 수도, 혹은 변경이 가능하도록 빌려올 수도 있다.

여기서는 &self를 택했다. 여기서는 소유권을 가져오는 것을 원하지 않으며, 다만 구조체 내의 데이터를 읽기만 하고, 쓰고 싶지는 않다. 만일 그 메소드가 동작하는 과정에서 메소드 호출에 사용된 인스턴스가 변하기를 원했다면, 첫번째 파라미터로 &mut self를 썼을 것이다. 그냥 self을 첫번째 파라미터로 사용하여 인스턴스의 소유권을 가져오는 메소드를 작성하는 일은 드물다. 이러한 테크닉은 보통 메소드가 self를 다른 무언가로 변형시키고 이 변형 이후에 호출하는 측에서 원본 인스턴스를 사용하는 것을 막고 싶을 때 종종 쓰인다.

함수를 사용하면, 메소드 구문 제공 및 모든 시그니처 내에 self를 반복 입력할 필요가 없다. 그럼에도 불구하고 함수 대신 메소드를 사용하는 이유는 코드 조직화에 관한 점이다.

연관 함수

impl 블록의 또다른 유용한 기능은 self 파라미터를 갖지 않는 함수도 impl 내에 정의하는 것이 허용된다는 점이다. 이를 연관 함수(associated functions)라고 부르는데, 그 이유는 이 함수가 해당 구조체와 연관되어 있기 때문이다. 이를 메소드가 아니라 여전히 함수인데, 이는 함께 동작할 구조체의 인스턴스를 가지고 있지 않아서이다. 예시: String::from

연관 함수는 새로운 구조체의 인스턴스를 반환해주는 생성자로 주로 사용된다.

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

이 연관 함수를 호출하기 위해서는 let sq = Rectangle::square(3); 처럼, 구조체 이름과 함께 :: 문법을 이용한다. 이 문법은 이 함수는 구조체의 이름 공간 내에 있다는 뜻이다.

출처: https://rinthel.github.io/rust-lang-book-ko/ch05-03-method-syntax.html

0개의 댓글