객체지향 프로그래밍의 장점 중 하나는 코드를 재사용하기가 용이하다는 것
- 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 기법인 상속에 관해 살펴보자
- 재사용 관점에서 상속이란 클래스 안에 정의된 인스턴스 변수와 메서드를 자동으로 새로운 클래스에 추가하는 구현 기법
- 상속 이외에 코드를 효과적으로 재사용하는 방법인 합성은 다음장에서 배워보자
상속과 중복 코드
DRY 원칙 (Don't Repeat Yourself)
전화요금을 계산하는 애플리케이션을 통한 예시
- 밤에 전화하면 세금을 할인해 주는 Phone의 등장을 상속으로 구현하려 함
타입 코드 사용 - 낮은 응집도와 높은 결합도라는 문제 발생
if(type == PhoneType.REGULAR) {
} else if (type == PhoneType.NIGHT) {
}
상속을 이용해서 중복 코드 제거하기 - 자식 코드가 부모 클래스에 결합이 심해진다.
취약한 기반 클래스 문제
상속이라는 문맥 안에서 결합도가 초래하는 문제점
캡슐화를 약화시키고 결합도를 높인다
상속을 통한 재사용을 고려하지 않은 클래스를 상속받으면.. 장점보다는 문제점이 커진다
Phone 다시 살펴보기
지금까지의 문제를 해결할 수 있는 키는 추상화이다.
- 자식 클래스가 부모 클래스의 구현이 아닌 추상화에 의존하도록 만드는 것
- 차이점을 메서드로 추출하고 공통적인 부분은 부모 클래스로 이동
업무에서도 중복 코드를 제거하려고 많이 노력한다.
그 과정 중에 FACTORY를 사용하거나, 상속을 사용하는 것 같다.
상속을 이용한 중복 제거의 단점으로는 자녀가 부모의 영향을 많이 받는다
- 부모의 코드를 잘 알고 있어야, 자식 코드를 작성할 수 있다
- 부모의 코드가 바뀌면, 자식에게도 영향이 갈 수 있다
이러한 현상이 취약한 기반 클래스라고 말하나 보다. 이런 용어가 있는지도 처음 알았는데 잘 지은 단어인 거 같다
취약한 기반을 토대로 코드를 작성하기보다는
중복을 제거하기 위해서 추상화를 시키자
추상화 클래스에 공통부분을 작성하고, 각 클래스마다 달라지는 행동은 하위에서 작성하자.
그러기 위해서는 추상화 메서드를 잘 뽑아야 한다.