상속과 합성
가. 어떤 경우에 상속을 사용해야 하는가?
인터페이스로 정의한 타입을 계층적으로 구현할 때, 행동양식면에서 IS-A 관계일 때
•
시스템을 사용하는 입장에서 동일한 행동을 기대할 수 있는 객체를 ‘상속'으로 구현
나. 어떤 경우에 상속의 유혹을 피해야 하는가?
간단하게 코드를 재사용하고 싶을 때, 어휘적으로 IS-A 관계나 행동양식면에서는 해당 관계가 아닐 때
다. 상속을 합성으로 대체하는 방법은?
extends 제거, 참조하려는 객체의 인스턴스를 필드로 참고
라. 상속 보다 합성이 나은 이유는?
•
상속은 컴파일 타임에서 모든 관계가 고정되지만, 합성은 런타임에서 관계가 유연하게 대체 가능함
→ 동적인 변경이 가능하므로 객체를 유연하게 활용 가능
SOLID 원칙
가. SOLID 원칙을 지킨 구조를 모델링한다면?
•
SRP: 객체 내부의 구현을 확인할 수 없으므로 해당 원칙의 수칙여부를 알 수 없음
◦
예를 들어, Movie 내부에 onionPopCorn이라는 이상한 책임이 포함되어 있다면 SRP 위반
•
OCP: DiscountPolicy 상속하여 OverlappedDiscountPolicy를 추가해도 기존 코드(Movie)를 수정할 필요가 없기 때문에 OCP를 만족함
•
LSP: 기반 타입(OverlappedDiscountPolicy) 대신 서브 타입(PercentDiscountPolicy)으로 대체 가능하므로 LSP 만족
•
ISP: 주어진 UML만으로는 인터페이스 분리에 따른 객체 간 결합도를 확인할 수 없음
•
DIP: 최상위 모듈인 DiscountPolicy에 이하 DiscountPolicy 하위 모듈과 Movie가 의존하므로 DIP 만족
image from 13장, 오브젝트, 조영호