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