C.W.K.
Stream
Lesson 04 of 05 · published

메서드 & 연관 함수

~11 min · types, methods, impl, self

Level 0Rust 호기심러
0 XP0/80 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete

struct 는 데이터를 들고; impl 블록이 동작을 붙여. 여기서 self 파라미터 — 그리고 이미 아는 소유권 규칙 — 가 메서드 형태로 등장해.

impl 블록

메서드를 impl TypeName { ... } 안에 정의해. 메서드의 첫 파라미터는 self 형태고, 어느 형태를 고르느냐가 메서드가 인스턴스를 뭐 하는지 정확히 말해: 빌리거나, 수정하거나, 소비하거나.

세 가지 self

&self 는 읽으려고 인스턴스를 빌려 — 대부분 메서드의 기본값. &mut self 는 제자리 수정하려고 빌리고. 맨 self 는 인스턴스를 소비 해 (소유권 가져감), 메서드가 값을 다른 걸로 변형하고 원본이 살면 안 될 때 써. 배운 빌림 규칙이 직접 적용돼: &self 는 불변 borrow, &mut self 는 가변.

self 의 형태가 메서드의 계약이야. &self = '읽을게.' &mut self = '너를 바꿀게.' self = '너를 소비할게.' 읽는 사람이 메서드 시그니처를 보고 receiver 에 뭘 하는지 즉시 알아 — 추측 없음.

연관 함수

impl 블록 안에 self 가 없는 함수가 연관 함수 고, :: 로 호출해. 보편적 예가 생성자야: 관습상 fn new(...) -> Self 라 쓰고 Point::new(1, 2) 로 불러. Self (대문자 S) 는 impl 이 붙은 타입의 단축이야.

Code

생성자, 읽기 메서드, 수정 메서드·rust
#[derive(Debug)]
struct Rect { w: u32, h: u32 }

impl Rect {
    // 연관 함수 (생성자) — self 없음, :: 로 호출
    fn new(w: u32, h: u32) -> Self {
        Self { w, h }
    }
    // &self: 읽으려고 빌림
    fn area(&self) -> u32 {
        self.w * self.h
    }
    // &mut self: 제자리 수정하려고 빌림
    fn scale(&mut self, factor: u32) {
        self.w *= factor;
        self.h *= factor;
    }
}

fn main() {
    let mut r = Rect::new(3, 4); // 연관 함수
    println!("area = {}", r.area()); // 메서드
    r.scale(2);
    println!("{r:?} area = {}", r.area());
}

External links

Exercise

Rect struct 에 new 생성자, area(&self) 메서드, 그리고 정사각형을 짓는 square(size: u32) -> Self 연관 함수를 줘. 셋 다 호출해. area 는 불변 Rect 에 부를 수 있는데 scale 은 왜 mut 이 필요해?
Hint
area&self (불변 borrow) 를 받아서 어떤 Rect 에든 통해. scale&mut self 를 받아서 바인딩이 mut 이어야 해 — 같은 aliasing 규칙이 메서드의 self 형태로 표현된 거야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 똘이warm

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.