C.W.K.
Stream
Lesson 02 of 07 · published

기본 메서드 구현

~10 min · traits, default-methods

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

trait 메서드가 추상적일 필요는 없어. trait 안에 바로 기본 구현 을 줄 수 있고, 타입들은 override 안 하면 공짜로 그걸 얻어.

공짜 동작

trait 정의에 본문을 주면 모든 구현자가 아무것도 안 쓰고 그걸 물려받아. 타입은 커스텀 동작이 필요하면 여전히 기본을 override 할 수 있고. 이게 trait 이 구현자한테 작은 코어만 쓰게 요구하면서 풍부한 API 를 제공하는 방식이야.

필수 메서드를 부르는 기본 메서드

강력한 수: 기본 메서드가 같은 trait 의 다른 메서드를 부를 수 있어 — 기본 없는 것까지. 그래서 구현자한테 작은 메서드 하나를 제공하라 요구하고, trait 이 그 위에 동작 한 무리를 지어. 표준 라이브러리 Iterator 가 정확히 이렇게 작동해: next 를 구현하면 수십 개 메서드 (map, filter, sum...) 를 공짜로 얻어.

조금 요구하고, 많이 제공해. 최고의 trait 설계는 구현자한테 최소 코어 메서드를 요구하고, 그 위에 기본 메서드를 쌓아. Iteratornext() 만 요구하고 그 위에 지은 70+ adapter 메서드를 건네줘. 네 trait 도 같은 식으로 설계해.

왜 이게 상속을 이기냐

클래스 기반 언어에선 base class 를 상속해서 공유 동작을 얻어 — 그 데이터랑 계층 속 자리를 끌고 오면서. 기본 trait 메서드는 그 결합 없이 공유 동작 을 줘: 어디의 어떤 타입이든 trait 에 옵트인해서 기본을 얻어, 가계도에 강제로 들어가지 않고.

Code

물려받고 override 되는 기본 메서드·rust
trait Greet {
    fn name(&self) -> String;            // 필수 — 구현자가 제공
    fn hello(&self) -> String {          // 기본 — name() 위에 지음
        format!("Hello, {}!", self.name())
    }
}

struct Dog;
impl Greet for Dog {
    fn name(&self) -> String { "Rex".into() }
    // hello() 는 공짜로 옴
}

struct Robot;
impl Greet for Robot {
    fn name(&self) -> String { "Unit-7".into() }
    fn hello(&self) -> String { format!("BEEP. I am {}.", self.name()) } // override
}

fn main() {
    println!("{}", Dog.hello());   // Hello, Rex!
    println!("{}", Robot.hello()); // BEEP. I am Unit-7.
}

External links

Exercise

Describe trait 에 describe() 를 불러 대문자화하는 기본 메서드 loud_describe(&self) 를 더해. 기본을 override 안 하는 타입 하나, override 하는 타입 하나에 trait 을 구현해. 둘 다 예상대로 동작하는지 확인해.
Hint
기본이 필수 describe() 를 부르니, 어떤 구현자든 loud_describe 를 공짜로 얻어. override 는 옵트인이야 — std 가 Iterator 에 쓰는 그 require-little-provide-lot 패턴이야.

Progress

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

댓글 0

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

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