
133
2
장
트레이트
레이트 객체를 사용하도록 작성된 함수에 대해 컴파일러는 코드를 한 가지 버전으로만 생성하
지만, 이 함수가 받는 트레이트 객체는 여러 타입에서 파생될 수 있다.
/// 객체가 화면에 있는지 나타낸다.
pub fn on_screen(draw: &dyn Draw) -> bool {
overlap(SCREEN_BOUNDS, draw.bounds()).is_some()
}
// `on_screen(&dyn Draw) -> bool`을 호출한다.
let visible = on_screen(&square);
// 아래 코드도 `on_screen(&dyn Draw) -> bool`을 호출한다.
let visible = on_screen(&circle);
간단히 비교하기
지금까지 살펴본 내용을 토대로 두 가지 방식을 간단히 비교하면 다음과 같다.
●
제네릭을 사용하면 생성되는 코드가 비대해질 가능성이 높다. 제네릭으로 만든
on_screen
함수 (
on_
screen::<T>(&T)
)가 호출될 때 적용되는 타입
T
마다 코드 복사본이 생성되기 때문이다. 이에 반해 트
레이트 객체로 만들면 (
on_screen(&dyn T)
) 함수에 대한 인스턴스가 하나만 존재한다.
●
제네릭에서 트레이트 메서드를 호출하는 것이 트레이트 객체를 사용하는 코드에서 호출하는 것보다 살