서브타입을 목적으로 상속을 사용할 때 고려해야 하는 규칙과 원칙

서론

상속이 두 가지 용도로 사용된다느 사실을 이해하는 것이 가장 중요하다.

상속의 용도

  1. 타입 계층 구현 타입 계층 안에서 부모 클래스는 일반적인 개념을 구현하고 자식 클래스는 특수한 개념을 구현한다. 타입 계층의 관점에서 부모 클래스는 자식 클래스의 일반화이고 자식 클래슨느 부모의 특수화다.
  2. 코드 재사용 상속을 사용하면 점진적으로 애플리케이션의 기능을 확장할 수 있다. 재사용을 위해 상속을 사용할 경우 강하게 결합되기 때문에 변경하기 어려운 코드를 얻으므로 지양해야한다.

따라서, 상속을 사용하는 목적은 무조건 “타입 계층 구현”하는 것이어야만 한다.

→ 다형적으로 동작하는 객체들의 관계에 기반해 확장 가능하고 유연한 설계를 얻을 수 있게 된다.

일반화

일반화는 보다 범용적이고 광범위한 개념을 나타냅니다. 상속 관계에서 부모 클래스는 보다 일반적인 개념을 나타내며, 자식 클래스들의 공통적인 속성과 행동을 정의합니다. 일반화를 통해, 다양한 하위 타입들이 공유할 수 있는 기본적인 구조와 행동을 추출하여 공통의 부모 클래스에 정의할 수 있습니다. 이는 코드 재사용을 촉진하고, 유지 관리를 용이하게 합니다.

예를 들어, "동물" 클래스는 모든 동물이 공통으로 가지고 있는 속성과 행동을 정의할 수 있는 일반적인 개념입니다. 이 클래스에는 "먹다", "자다"와 같은 메서드가 포함될 수 있습니다.

특수화

특수화는 일반화의 반대 개념으로, 보다 구체적이고 특정한 개념을 나타냅니다. 상속 관계에서 자식 클래스는 부모 클래스보다 더 특정한 속성이나 행동을 추가하여 구체화합니다. 자식 클래스는 부모 클래스의 속성과 행동을 상속받으며, 그 위에 추가적인 특성이나 메서드를 정의하여 특정한 개념을 구현합니다.

"동물" 클래스를 상속받는 "고양이" 클래스는 "동물"의 특수한 형태로, "동물" 클래스에 정의된 일반적인 행동을 상속받으면서 "야옹하다"라는 고양이만의 특별한 행동을 추가로 정의할 수 있습니다.