Ch.10 상속과 코드 재사용
상속
클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 방법.
합성 - 상속이 아닌, 코드를 재사용하는 또 다른 방법. 인스턴스 안에 기존 클래스의 인스턴스를 포함시킨다.
상속을 도입하는 두 가지 원칙
두 메서드가 유사해 보이면 차이점을 메서드로 추출해 동일하게 보이도록 하자. (e.g., 서로 다른 계산 로직)
'위로 올리기' 전략 - 부모 클래스의 코드를 하위로 내리지 말고, 자식 클래스의 추상적인 코드(메서드)를 상위로 올려라.
DRY - 코드를 재사용하자, 중복을 제거하자
코드를 재사용한다는 것은 중복된 코드를 제거하고자 함이다.
코드 중복은 주저와 의심을 낳고, 변경하기 어렵게 만든다.
중복 여부를 판단하는 기준은 변경이다.
DRY 원칙 (Don't Repeat Yourself) - 동일한 지식을 중복하지 말라!
a.k.a. 한 번, 단 한번(Once and Only Once) 원칙
a.k.a. 단일 지점 제어(Single-Point Control) 원칙
중복 코드 줄이기
여러 가지 방법이 있다.
클래스를 하나로 합치기
타입 코드를 이용해 분기하여 클래스를 합칠 수 있다. 하지만 타입 코드는 낮은 응집도와 높은 결합도를 낳는다.
상속
가장 대표적인 방법 중 하나지만, 취약한 기반 클래스 문제(Fragile/Brittle Base class Problem)가 생길 수 있다. 부모와 자식 클래스가 강하게 결합된다. (영원히 바꿀 수 없거나 둘 다 고쳐야 한다.)
그러면 인터페이스를 쓰면 되지 않나? 싶지만, 충분한 고려 없이 단순히 재사용을 위해 인터페이스를 도입하면 위험하다. (e.g.,
Stack
->Vector
,Properties
->HashMap
)의존성을 역전시켜 자식 클래스가 부모 클래스의 구현에 의존하는 것이 아니라, 부모와 자식 클래스 모두가 추상화에 의존하도록 하자.
합성
다음 챕터에!
Last updated