Thinking Different




트레잇(Trait)

다른 프로그래밍 언어의 인터페이스 또는 추상화 클래스와 유사하다.

러스트에는 상속의 개념이 존재하지 않기 때문에 트레잇을 통해 다양한 타입들이 동일한 기능을 수행할 수 있도록 해주며, 코드 재사용과 추상화를 가능하게 해준다.

 

 

트레잇 생성

구현은 뺴고 선언만 하였다, (구현도 가능함)

trait 자동차 
{
    fn show(&self);
}

 

트레잇을 구현하는 구현부를 살펴보자

struct 트럭;
impl 자동차 for 트럭
{
    fn show(&self) { println!("픽업 트럭"); }
}

트레잇에서 선언된 함수를 구현하였다. 자바의 인터페이스 구현과 비슷하다.

 

다음과 같이 사용 가능하다.

fn main()
{
    let truck = 트럭;

    truck.show();
}

// 실행 결과

픽업 트럭

 

 

 

트레잇 바운드(Trait Bound)

트레잇을 제너릭 타입으로 구현 가능하도록 한다.

 

fn 트레잇바운드<T: 트럭>(car: T)
{
    println!("트레잇 바운드 구현");
}

 

 

위 트레잇 코드 예제를 트레잇 바운드 제너릭 타입으로 구현해보도록 한다.

trait 자동차 
{
    fn show(&self) -> String;
}

struct 트럭 
{
    pub 타입: String,
}

impl 자동차 for 트럭
{
    fn show(&self) -> String { format!("종류 : {}", self.타입) }
}

fn 트레잇바운드<T: 자동차>(car: T)
{
    println!("[trait bound] {}", car.show());
}

fn main()
{
    let truck = 트럭 { 타입:String::from("픽업트럭") };
    트레잇바운드(truck);
}

// 실행 결과
[trait bound] 종류 : 픽업트럭