Rust에서 trait은 무엇인가?

trait이란

  • trait이란 일종의 인터페이스 같은 역할을 함. 우리가 아는 인터페이스처럼 내부는 필요에 따라 각각 구현해서 이게 어떻게 동작할 정의함.
pub trait Summarizable {
    fn summary(&self) -> String;
}

pub struct NewsArticle {
    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
}

impl Summarizable for NewsArticle {
    fn summary(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}

pub struct Tweet {
    pub username: String,
    pub content: String,
    pub reply: bool,
    pub retweet: bool,
}

impl Summarizable for Tweet {
    fn summary(&self) -> String {
        format!("{}: {}", self.username, self.content)
    }
}

let tweet = Tweet {
    username: String::from("horse_ebooks"),
    content: String::from("of course, as you probably already know, people"),
    reply: false,
    retweet: false,
};

println!("1 new tweet: {}", tweet.summary());
  • Summarizable라는 일종의 인터페이스를 구현하고, 내부의 summary는 무조건 String을 반환해야 하는 함수임.
  • 위 예제에서는 뉴스나 아티클에 따라 다르게 summary를 메서드를 구현해서 원하는 동작을 하게함.
  • 근데 이건 독특하게 trait 자체에서 메서드 구현도 가능함. trait에 있는 걸 쓰거나, 다시 구현해서 override하거나 하는 선택지를 주는 거임. 이건 좀 유용할지도?

트레잇 바운드

  • 위 예제처럼 트레잇에 대한 각각의 부분들을 따로 구현했다면, 이걸 사용해서 뭔가를 하려는 메서드도 있을 거임. 타입이 뭔지 구분하지 않고 어떠한 타입의 인스턴스라도 제네릭으로 받은 후, 트레잇 함수는 알아서 처리하게 하는거지. 만약에 트레잇을 구현하지 않은 타입이라면 컴파일러가 알아서 컴파일 오류를 내줌. 제네릭 타입 파라미터를 사용하는 이걸 트레잇 바운드라고 함.
pub fn notify<T: Summarizable>(item: T) {
    println!("Breaking news! {}", item.summary());
}
 Date: February 1, 2023
 Tags:  RUST

Previous:
⏪ 러스트의 소유권

Next:
postgresSQL - pgBouncer ⏩