인터페이스

Rust에는 C#/.NET과 같은 인터페이스가 없습니다. 대신 _트레이트_를 사용합니다. 트레이트도 인터페이스처럼 추상화를 표현하며, 멤버를 통해 구현 타입이 충족할 계약을 정의합니다.

C#/.NET 인터페이스에 기본 메서드 구현을 넣을 수 있듯 Rust 트레이트에도 기본 구현을 제공할 수 있습니다. 구현 타입은 필요에 따라 더 적합하거나 최적화된 구현으로 이를 대체할 수 있습니다.

C#/.NET 인터페이스에는 속성, 인덱서, 이벤트, 정적 메서드와 인스턴스 메서드 등 여러 종류의 멤버를 넣을 수 있습니다. Rust 트레이트에는 인스턴스 메서드와 연관 함수, 상수를 정의할 수 있습니다. 연관 함수는 C#/.NET의 정적 메서드와 비슷합니다.

인터페이스는 클래스 계층 외에도 여러 타입에 걸친 추상화를 동적 디스패치로 다루는 주요 수단입니다. 구체적인 구현 타입을 몰라도 인터페이스를 기준으로 범용 코드를 작성할 수 있습니다. Rust의 _트레이트 객체_도 제한된 범위에서 같은 역할을 합니다. 트레이트 객체는 사실상 가상 메서드 테이블인 _v-table_을 사용하며, dyn Shape처럼 dyn 뒤에 트레이트 이름을 적습니다. 여기서 Shape는 트레이트 이름입니다. 트레이트 객체는 항상 &dyn Shape 같은 참조나 Box<dyn Shape> 같은 힙 할당 포인터 뒤에 놓입니다. .NET에서도 인터페이스는 참조 타입으로 다뤄지며, 값 타입을 인터페이스로 변환하면 관리 힙에 박싱됩니다.

트레이트 객체에는 원래 구현 타입을 다시 알아내기 어렵다는 제약이 있습니다. C#에서는 인터페이스 값을 다른 인터페이스나 하위 타입 또는 구체 타입으로 다운캐스트하거나 타입을 검사하는 일이 흔합니다. Rust에서는 별도의 지원이나 추가 작업 없이 같은 방식으로 처리할 수 없습니다.