객체지향

오브젝트(조영호) 책 정리 -11-

정한_s 2021. 11. 23. 10:58

상속에서 부모 클래스와 자식 클래스 사이의 의존성은 컴파일 타임에 해결되지만 합성에서 두 객체 사이의 의존성은 런타임에 해결된다. 상속 관계는 is-a 관계라고 부르고 합성 관계는 has-a 관계이다. 

 

상속은 부모 클래스의 내부 구현에 대해 상세히 알아야 하기 때문에 코드 재사용 측면에서 좋은 방법은 아니다. 그에 반해 합성은 구현에 의존하지 않기 때문에 변경에 안정적인 코드를 얻을 수 있다.

 

또한 상속 관계는 정적인 관계이지만 합성 관계는 동적인 관계이다. 코드 작성 시점에서 상속 관계는 변경이 불가능 하지만 합성 관계는 실행 시점에 동적으로 변경할 수 있다. 이는 변경하기 쉽고 유연한 설계를 얻을 수 있다.

 

상속의 주요한 문제점 

  • 불필요한 인터페이스 상속 문제 : 자식 클래스에게 부적합한 부모 클래스의 오퍼레이션이 상속되기 때문에 자식 클래스 인스턴스의 상태가 불안정해지는 문제
  • 메서드 오버라이딩의 오작용 문제 : 자식 클래스가 부모 클래스의 메서드를 오버라이딩할 때 자식 클래스가 부모 클래스의 메서드 호출 방법에 영향을 받는 문제

합성을 사용하면 상속이 초래하는 주요한 문제점을 해결할 수 있다.

 

상속의 유지보수 측면의 문제점

상속으로 인해 결합도가 높아지면 코드를 수정하는 데 필요한 작업의 양이 늘어난다. 일반적으로 다음과 같은 두 가지 문제점이 발생한다

  • 하나의 기능을 추가하거나 수정하기 위해 불필요하게 많은 수의 클래스를 추가하거나 수정해야 한다
  • 단일 상속만 지원하는 언어에서는 상속으로 인해 오히려 중복 코드의 양이 늘어날 수 있다

합성을 사용하면 상속으로 발생하는 클래스의 증가와 중복 코드의 문제를 간단히 해결할 수 있다.

 

따라서, 코드 재사용 측면에서 객체 합성이 클래스 상속보다 더 좋은 방법이다.

 

* 믹스인은 합성 말고도 다양한 언어에서 상속의 단점을 보완하고자 사용하는 방법이다. 믹스인은 객체를 생성할 때 코드 일부를 클래스 안에 섞어 넣어 재사용하는 방법이다. 

상속과 믹스인의 차이점은 상속은 정적이지만 믹스인은 동적이다. 상속은 부모 클래스와 자식 클래스의 관계를 코드를 작성하는 시점에 고정시켜 버리지만 믹스인은 제약을 둘 뿐 실제로 어떤 코드에 믹스인 될 것인지 런타임에 결정한다.