Trait와 오버라이딩: 오버로딩이 아니라 오버라이딩
태그: 모바일 편집 모바일 웹 편집
태그: 모바일 편집 모바일 웹 편집
 
308번째 줄: 308번째 줄:
Trait는 부분적인 다형성을 구현한 Rust만 가지고 있는 객체 개념으로 일반적인 OOP(객체 지향 프로그래밍) 방식을 따르지 않고 구조체에 한정적인 다형성을 부여하기 위해 도입되었다. 즉 공통적인 메서드를 구조체마다 부여하는 역할을 한다.
Trait는 부분적인 다형성을 구현한 Rust만 가지고 있는 객체 개념으로 일반적인 OOP(객체 지향 프로그래밍) 방식을 따르지 않고 구조체에 한정적인 다형성을 부여하기 위해 도입되었다. 즉 공통적인 메서드를 구조체마다 부여하는 역할을 한다.


Trait는 제네릭처럼 변수의 타입에 구애받지 않아 오버로딩을 구현하는 또 다른 방법이 된다. 다만 가능한 데이터 타입에 대한 구현을 모두 메모리 한 곳에 직접 올리는 제네릭과 달리 Trait는 구조체에 함수 포인터를 간접적으로 가져오는 특성 때문에 성능 쪽에서 아주 작은 수준이라도 패널티가 있다. 보통 다음과 같이 트레이트를 정의하고 부여한다.
Trait는 제네릭처럼 변수의 타입에 구애받지 않아 오버라이딩을 구현하는 또 다른 방법이 된다. 다만 가능한 데이터 타입에 대한 구현을 모두 메모리 한 곳에 직접 올리는 제네릭과 달리 Trait는 구조체에 함수 포인터를 간접적으로 가져오는 특성 때문에 성능 쪽에서 아주 작은 수준이라도 패널티가 있다. 보통 다음과 같이 트레이트를 정의하고 부여한다.


<syntaxhighlight lang="rust">
<syntaxhighlight lang="rust">
342번째 줄: 342번째 줄:
}
}


fn notify<T: Account>(item: T) { // 제네릭 변수처럼 Account Trait가 적용된 구조체라면 전부 item으로 집어넣는 오버로딩이 된다.
fn notify<T: Account>(item: T) { // 제네릭 변수처럼 Account Trait가 적용된 구조체라면 전부 item으로 집어넣는 오버라이딩 된다.
     println!("Welcome {}", item.get_username());
     println!("Welcome {}", item.get_username());
}
}