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

Trait 정의하고 구현하기

~12 min · traits, impl, polymorphism

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

Types 트랙은 많은 걸 못 하는 제네릭 Point<T> 를 남겼어 — 맨 T 는 더하거나 출력 못 해. trait 이 답이야. trait 은 여러 타입이 구현할 수 있는 공유 동작 을 정의하고, Rust 가 다형성을 하는 방식이야.

trait 이 뭐냐

trait 은 타입이 제공하기로 약속하는 메서드 시그니처 묶음이야. Java 나 C# 의 인터페이스를 써봤으면 모양이 익숙해 — 근데 Rust 의 trait 은 더 나아가, 기본 메서드, 제네릭 bound, 연관 타입까지. trait Name { ... } 으로 선언하고, 구현자가 제공해야 할 메서드를 나열해.

trait 구현하기

impl TraitName for TypeName { ... } 는 '이 타입이 이 동작을 제공해' 라고 말해. 한 타입이 여러 trait 을 구현하고; 한 trait 을 여러 타입이 구현해. 그 다대다 그물이 Rust 가 상속 계층 없이 동작을 조합하는 방식이야.

trait 은 공유 데이터가 아니라 공유 동작이야. struct 는 타입이 무엇 인지 말하고 (필드); trait 은 타입이 뭘 할 수 있는지 말해 (메서드). Rust 는 둘을 의도적으로 분리해 — base class 도, 상속 트리도 없이, 그냥 타입이랑 걔들이 옵트인하는 동작뿐.

coherence 규칙

가드레일 하나: trait 이나 타입 중 하나를 네가 소유해야만 그 타입에 trait 을 구현할 수 있어 — 'orphan 규칙'. 두 크레이트가 같은 타입에 같은 trait 을 충돌하게 구현하는 걸 막아. 그래서 외부 trait 을 외부 타입에 구현하려고 가끔 외부 타입을 네 struct 로 감싸 (newtype 패턴).

Code

trait 하나, 구현자 둘·rust
trait Summary {
    fn summarize(&self) -> String;
}

struct Article { title: String, body: String }
struct Tweet { user: String, text: String }

impl Summary for Article {
    fn summarize(&self) -> String {
        format!("{} ({}...)", self.title, &self.body[..self.body.len().min(8)])
    }
}
impl Summary for Tweet {
    fn summarize(&self) -> String {
        format!("@{}: {}", self.user, self.text)
    }
}

fn main() {
    let a = Article { title: "Rust".into(), body: "fearless code".into() };
    let t = Tweet { user: "ferris".into(), text: "hi".into() };
    println!("{}", a.summarize());
    println!("{}", t.summarize());
}

External links

Exercise

메서드 describe(&self) -> String 하나짜리 Describe trait 을 정의해. 관련 없는 struct 둘 (예: Book 이랑 Car) 에 구현해. 그다음 둘 중 아무거나의 참조를 받아 설명을 출력하는 함수를 써. trait 이 구체 타입은 못 하는 뭘 하게 해줬어?
Hint
trait 은 구체 타입을 모른 채로 한 함수가 Describe 를 구현하는 아무 타입이나 받게 해줘. 그게 다형성이야 — 관련 없는 타입들에 걸친 공유 동작, 상속 불필요.

Progress

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

댓글 0

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

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