2. 트레이트 바운드 (Trait Bound)
트레이트는 제네릭을 사용할 때, 제네릭 타입에 특성을 부여하는 역할도 합니다.
다음 예제를 보겠습니다. 간단한 Point 구조체와 Calculatable 트레이트를 만들고 Point에 Calculatable 트레이트를 구현했습니다. 구현된 show_me 함수는 단순히 구조체를 출력합니다.
// 트레이트 정의
trait Calculatable {
fn show_me(&self);
}
// 구조체 정의
#[derive(Debug)]
struct Point {
x: i32,
y: i32,
}
// Point 구조체 메소드
impl Point {
fn new(x: i32, y: i32) -> Point {
Point { x, y }
}
}
// Calculatable를 Point에 구현
impl Calculatable for Point{
fn show_me(&self) {
println!("{:?}", self);
}
}
// 제네릭 타입에 트레이트 바운드 설정 하기
fn what_is_this<T: Calculatable>(shape: &T) {
shape.show_me()
}
fn main() {
let point= Point::new(1,2);
what_is_this(&point);
}
// 출력
Point { x: 1, y: 2 }
마지막 부분의 what_is_this 함수를 보면 함수명 뒤 제네릭 타입을 선언하는 부위에 <T: Calculatable>가 있습니다. 이것은 제네릭 타입 T는 Calculatable 속성 또는 트레이트를 가져야 한다는 의미입니다. 조금 다르게 말하자면, Calculatable 속성을 가진 타입이면 무엇이든 가능하다는 의미입니다.
트레이트 바운드 대신 파라미터 타입에 직접 선언할 수도 있습니다.
fn what_is_this(shape: &impl Calculatable) {
shape.show_me()
}
모양이 생소하지만 의미는 동일 합니다. 이제 shape 파라미터에는 Calculatable 특성을 가진 어떤 타입도 사용할 수 있습니다.
만약 트레이트를 여러 개 적용하려면 “+” 기호를 사용합니다.
fn what_is_this<T: Calculatable + Copy>(shape: &T) {
shape.show_me()
}
Calculatable 트레이트 뒤에 “+” 기호를 사용해서 Copy 트레이트가 더 해졌습니다. 이제 제네릭 타입 T는 Calculatable와 Copy 트레이트를 속성으로 가지고 있어야 합니다.
반응형
'Rust 입문' 카테고리의 다른 글
[Rust] Standard trait와 derivable trait (0) | 2022.10.13 |
---|---|
[Rust] Dynamic Object (0) | 2022.10.13 |
[Rust] Trait (0) | 2022.10.13 |
[Rust] Generic (0) | 2022.10.12 |
[Rust] use 사용하기 (0) | 2022.10.11 |