부록 B. 타입 계층의 구현
- 타입 계층은 동일한 메시지에 대한 행동 호환성을 전제로 하기 때문에 아래에서 언급하는 모든 방법은 타입 계층을 구현하는 방법인 동시에 다형성을 구현하는 방법입니다.
- 여기서 제시하는 방법을 이용해 타입과 타입 계층을 구현한다고 해서 서브타이핑 관계가 보장되는 것은 아닙니다.
#
클래스를 이용한 타입 계층 구현- 클래스는 객체의 타입과 구현을 동시에 정의하는 것과 같습니다.
- 클래스는 타입을 구현할 수 있는 다양한 방법 중 하나입니다.
#
인터페이스를 이용한 타입 계층 구현- 상속으로 인한 결합도 문제를 피하고 다중 상속이라는 구현 제약도 해결할 수 있는 방법은 클래스가 아닌 인터페이스입니다.
- 타입을 구현한 클래스를 보면 다음을 알 수 있습니다.
- 여러 클래스가 동일한 타입을 구현할 수 있다
- 하나의 클래스가 여러타입을 구현할 수 있다.
- 클래스가 아니라 타입에 집중을 해야합니다.
#
추상 클래스를 이용한 타입 계층 구현- 클래스 상속을 이용해 구현을 공유하면서도 결합도로 인한 부작용을 피하는 방법이 있습니다. 이가 바로 추상 클래스를 이용하는 방법입니다.
- 구체 클래스로 타입을 정의해서 상속받는 방법과 추상 클래스로 타입을 정의해서 상속받는 방법 사이에는 두 가지 중요한 차이점이 있습니다.
- 첫 번째로 의존하는 대상의 추상화 정도가 다릅니다.
- 두 번째 차이점은 상속을 사용하는 의도입니다.
#
추상 클래스와 인터페이스 결합하기- 인터페이스를 이용해 타입을 정의하고 특정 상속 계층에 국한된 코드를 공유할 필요가 있을 경우에는 추상 클래스를 이용해 코드 중복을 방지하는 것입니다. 이러한 방식을 골격 구현 추상 클래스(skeletal implementation abstract class) 라고 합니다.
- 인터페이스와 추상 클래스를 함께 사용하는 방법은 추상 클래스만 사용하는 방법에 비해 두 가지 장점이 있습니다.
- 다양한 구현 방법이 필요할 경우 새로운 추상 클래스를 추가해서 쉽게 해결할 수 있습니다.
- 이미 부모 클래스가존재하는 클래스라고 하더라도 인터페이스를 추가함으로써 새로운 타입으로 쉽게 확장이 가능합니다.
#
덕 타이핑 사용하기- 덕 테스트는 어떤 대상의 '행동'이 오리와 같아면 그것을 오리라는 타입으로 취급해도 무방하는 것입니다.
- 덕 타이핑은 타입이 행동에 대한 것이라는 사실을 강조합니다. 두 객체가 동일하게 행동한다면 내부 구현이 어떤 방식이든 상관없습니다. 타입 관점에서 두 객체는 동일한 타입인 것입니다.
- 템플릿을 잘 사용하면 관계가 없는 두 클래스를 동일한 타입으로 취급하는 것이 가능합니다.
- 설계뿐만 아니라 프로그래밍 언어 역시 트레이드오프의 산물입니다.
#
믹스인과 타입 계층- 믹스인(mixin) 은 객체를 생성할 때 코드 일부를 섞어 넣을 수 있도록 만들어진 일종의 추상 서브클래스입니다.
- 믹스인을 통해 코드를 재사용하는 객체들은 동일한 행동을 공유하게 됩니다.
- 믹스인은 간결한 인터페이스를 가진 클래스를 풍부한 인터페이스를 가진 클래스로 만들기 위해 사용될 수 있습니다.
- 자바의 경우에는 믹스인을 구현하기 위해 디폴트 메서드를 사용할 수 있습니다.
- 그러나 이런 방법은 좋지 않습니다. 자바8의 디폴트 메서드의 목적은 인터페이스에 새로운 오퍼레이션을 추가할 경우에 발생하는 하위 호환성 문제를 해결하기 위해서이며 추상 클래스를 제거하는 것이 목표가 아닙니다.
- 어떤 타입이 다른 타입의 서브타입이 되기 위해서는 구현할 때 리스코프 치환 원칙을 준수해야 합니다.