시뻘건 개발 도전기

러스트 14 - 구조체 #2 : 메소드 본문

프로그래밍/RUST

러스트 14 - 구조체 #2 : 메소드

시뻘건볼때기 2019. 3. 10. 21:55
반응형



메소드(Method)는 함수와 유사하게도 "fn" 키워드와 메소드 명으로 선언하게 되며, 파라미터와 반환되는 값을 가진다.

하지만! 메소드 라는 녀석은 구조체 컨텍스트(Context)에 정의되는데, 첫 번째 파라미터는 항상 "self"다. 이 새로운 녀석의 파라미터는 메소드가 호출되는 구조체의 인스턴스라고 생각하면 된다.



1. 메소드 정의


메소드를 정의해보자.


// 구조체 정의

struct Rectangle {

    length: u32,

    width: u32,

}


// 메소드 정의

impl Rectangle {

    fn area(&self) -> u32 {

        self.length * self.width    // 넓이 계산 : 가로 x 세로

    }

}


fn main() {

    let rect = Rectangle { length: 50, width: 30 };


    println!("rect의 넓이는 {}입니다.", rect.area());

}



"Rectangle" 컨텍스트 안에 함수를 정의하기 위해서는 impl(Implementation의 약자)를 사용한다. impl 블록 안에서 area 함수를 선언하게 되는데 위에서 언급한 바와 같이 self가 등장했다. (뭔가 this 바인딩 같은 그런 느낌이 온다....ㅠㅠ)



모든 메소드 시그니처에서 "self"를 반복하지 않아도 되고 조직화 관점에서 큰 이득을 가져다 주는 것이 메소드의 장점이라 할 수 있겠다.

만약 더 많은 함수를 넣고 싶다면 해당 메소드 안에 여러 종류의 함수를 추가하면 되겠다.




2. Associated 함수


impl 블록의 또 다른 기능이 있다.

self를 파라미터로 사용하지 않는 impl블록 내에서 함수를 정의할 수 있다는 것. 이런 함수를 연관(Associated) 함수라고 한다.

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


예를 들어 위 예제를 활용하여 연관 함수를 사용해 보는 코드이다.

struct Rectangle {

    length: u32,

    width: u32,

}


impl Rectangle {

    fn area(&self) -> u32 {

        self.length * self.width

    }


    fn square(size: u32) -> Rectangle {

        Rectangle {

            length: size,

            width: size,

        }

    }

}


fn main() {

    let square = Rectangle::square(100);


    println!("square 넓이 : {}", square.area());

}







구조체 안에 어떠한 필드를 넣고 어떠한 메소드, 함수 등 넣고 빼고 지지고 볶고 개발자 마음대로 커스텀이 가능하다.

그 만큼 알아보기 쉽고, 특성에 따라 잘 나누어서 구조체를 활용하면 충분히 명확하고 좋은 코드를 짤 수 있을 것같다.

반응형

'프로그래밍 > RUST' 카테고리의 다른 글

러스트 16 - 열거형 #2  (0) 2019.03.24
러스트 15 - 열거형 #1  (0) 2019.03.24
러스트 13 - 구조체 #1  (0) 2019.03.10
러스트 12 - 슬라이스 타입  (0) 2019.03.03
러스트 11 - References와 Borrowing  (0) 2019.03.02
Comments