[66해빗 페이백 챌린지] 13일차

tree·2023년 5월 14일
0

상속과 조립

상속의 문제점

  1. 상위 클래스의 캡슐화 약화 -> 강한 결합도
    • 상위 클래스의 캡슐화가 약화되어 하위 클래스가 상위 클래스의 구현에 의존하게 되면 상위 클래스와 하위 클래스는 강한 결합을 가지게 된다.
    • 둘의 결합도가 강해지면 상위 클래스의 코드 변경 시 하위 클래스가 많은 영향을 받게 된다.
  2. 클래스 폭발 문제
    • 상속 관계를 이용해 기능을 추가하거나 기능의 조합을 만들어내려고 하면 불필요하게 클래스의 개수를 늘리게 된다.
  3. 상속의 오용
    • 명백하게 IS-A 관계가 아닌 두 클래스 간에 상속 관계를 맺어주게 되면 하위 타입의 객체는 잘못된 방식(상위 타입)으로 사용되게 된다.
    • ex
      • 사람이 새를 상속할 때, 새 변수에 사람 객체를 대입하여 사람이 새처럼 동작하도록 사용할 수 있다. 예시가 이상하지만 클래스 간의 IS-A 관계를 잘못 파악하여 잘못 사용하는 경우가 분명히 있을 수 있다.

합성(조립)

  • 여러 객체를 묶어 더 복잡한 기능을 하는 객체를 만들어내는 것.
    • 객체 지향 언어에서는 보통 필드에 다른 객체를 가지는 방식으로 합성을 구현한다.
  • 상속이 가진 문제점(강한 결합, 클래스 폭발, 상속의 오용)을 해결할 수 있다.
  • 런타임 시점에 합성 대상 객체를 변경할 수 있다.
    • 상속은 코드 작성할 때 관계가 형성되기 때문에 상위 클래스를 바꿀 수 없다.
  • 본 객체가 할 일을 합성 객체에게 위임하는 방식이다.

상속은 언제 사용해야 할까?

  • IS-A 관계라는 게 명백할 때
  • 기능의 재사용이 아니라 기능의 확장에 초점을 둘 때.
    • 기능의 확장을 이용해 리스코프 치환 원칙을 지키고 다형성을 활용할 수 있는 코드 작성이 가능하다.
      • 하지만 상속보다는 인터페이스의 사용을 더 우선적으로 고려해 하위 클래스가 상위 클래스의 구현에 의존하는 것을 피하는 것이 좋다.
      • 자바 8부터는 인터페이스 default 메소드가 지원되므로 상속의 장점(상위 클래스의 기능을 유지하면서 확장할 수 있는 것)이 약해졌다.

결론

  • 코드의 재사용에 초점을 둔다면 합성을 우선 고려하라.
  • 재사용보다는 기능의 확장에 초점을 둔다면 상속을 고려하되 구체 상속보다는 인터페이스나 추상 클래스를 더 우선적으로 고려하라.

0개의 댓글