OOP to Rust

상속의 목적은 트레이트와 제네릭으로 더 명시적으로 나눈다

러스트는 부모 구조체의 필드와 메서드를 그대로 물려받는 상속 대신, 코드 공유와 다형성의 목적을 별도 도구로 표현합니다.

상속을 선택하는 이유

reuse

구현 재사용

부모 타입의 메서드 구현을 여러 하위 타입에서 다시 쓰고 싶습니다.

poly

같은 자리에서 사용

서로 다른 타입을 같은 인터페이스를 가진 값처럼 다루고 싶습니다.

risk

불필요한 공유 위험

하위 타입에 맞지 않는 메서드까지 함께 노출될 수 있습니다.

limit

설계 유연성 감소

단일 상속 구조에서는 조합보다 계층을 먼저 맞추게 됩니다.

러스트 대안

trait

기본 트레이트 메서드

Summary처럼 공통 동작을 기본 구현으로 제공하고 필요하면 오버라이드합니다.

bound

제네릭과 트레이트 바운드

필요한 능력만 제약으로 걸어 범주 내 매개변수형 다형성을 얻습니다.

object

트레이트 객체

런타임에 여러 구체 타입을 같은 인터페이스 뒤에 숨길 수 있습니다.

api

명시적 공개 API

캡슐화와 조합을 유지하면서 필요한 동작만 외부에 공개합니다.

핵심 정리

러스트의 선택은 상속을 없애는 데서 끝나지 않습니다. 공유할 동작, 대체 가능한 타입, 감출 구현을 각각 다른 문법으로 드러내 설계 의도를 더 좁게 표현합니다.