저작권 안내: 저작권자표시 Yes 상업적이용 No 컨텐츠변경 No

스프링5 입문

JSP 2.3

JPA 입문

DDD Start

인프런 객체 지향 입문 강의

'Composition versus inheritance'에 해당되는 글 1건

  1. 2013.08.27 Composition over Inheritance 에 대해 자칫 오해를 줄 수 있는 글

지인분께서 http://arload.wordpress.com/2009/02/18/misconception_of_gof_dp/ 이 링크를 보내주시면서, 의견을 물으셨다. 이 글을 보니 뭔가 결론이 글을 읽는 사람들에겐 불명확하다. 이 글의 주요 요지는 이렇다.


블로그 내용 요점 정리:

  • Erich Gamma의 인터뷰(http://www.artima.com/lejava/articles/designprinciplesP.html)의 내용:
    • A common misunderstanding is that composition doesn’t use inheritance at all. Composition is using inheritance, but typically you just implement a small interface and you do not inherit from a big class (번역해 보자면: 조합에 대한 잘못된 이해는 상속을 전혀 사용하지 않는다고 생각하는 건데, 실제로 조합은 상속을 사용한다. 단지, 큰 클래스를 상속받는 것이 아니라 작은 인터페이스를 구현할 뿐이다.)
  • 인터뷰 기반 정리:
    • 두번재 원칙인 Favor Object Composition over Class Inhertance 에서 Object Composition은” 상속을 사용하지 말라는 의미가 아니다”라는 것
    • Object Composition은 내부적으로 Interface Inheritance를 사용하다는 말이 명시적으로 있음
  • GoF 책 언급:
    • Class inheritance defines an object’s implementation in terms of another object’s implementation In short, it’s a mechanism for code and representation sharing..
  • GoF 책 문장으로 정리:
    • 두번째 원칙의 Class Inheritance는 Implementation Inheritance 였던 것
  • 그리고, 두 번째 원칙을 명확히 함:
    • Favor Object Composition (with Interface Inheritance) over Implementation Inheritance.
    • Favor Object Composition (with Subtyping) over Subclassing.


최종적으로 "Composition over inheritance"는 "구현 상속 보다는 인터페이스 상속을 사용한 객체 조합을 선호"하라는 말로 해석되어 질 수 있다고 결론을 내린다. 그런데, 문제는 여기서부터 출발한다. "인터페이스 상속을 사용한 객체 조합"? 완전 오해의 소지가 충만하다.


객체 지향을 잘 모르는 분들이 위 글을 보면 정말로 무슨 의미인지 정확히 이해가 안 될 수 있다. 그리고, 필자도 "구현 상속 보다는 인터페이스 상속을 이용한 객체 조합"이란 문장을 보면서 어떤 구조로 받아들여야 할지 애매하다.


여기서 한 가지 명확하게 할 점은,, "조합은 상속을 사용"한다라는 Erich Gamma의 인터뷰 내용이다. 여기서 상속을 사용한다는 말은 조합 대상이 되는 객체들이 상속을 사용한다라는 의미이다. 예를 들어, Erich Gamma가 예로 든 자바의 Listener를 보자.



Erich Gamma가 말한 "조합은 상속을 사용"한다라는 것은, 다른 객체를 포함하는 Button 객체가 아니라 조립 대상이 되는 ActionListener 타입의 객체에서 상속을 사용한다는 것이다. Erich Gamma의 인터뷰에 있는 " typically you just implement a small interface and you do not inherit from a big class" 이 문장은 Button 입장이 아니라, SomeActionListener 입장에서 쓰여진 문장이다. 즉, 일반적으로 조립 대상이 되는 객체(SomeActionListener)는 큰 클래스를 (구현) 상속 받기 보다는 (위 예제의 ActionListener와 같은) 작은 인터페이스를 상속받는다고 말한 것이다.


다시 Erich Gamma의 인터뷰 내용인 'A common misunderstanding is that composition doesn’t use inheritance at all. Composition is using inheritance, but typically you just implement a small interface and you do not inherit from a big class"의 의미를 해석해 보자. 이는 아래와 같다.

  • 조합을 사용한다고 해서 전혀 상속을 사용하지 않는 것은 아니다.
  • 조합 대상이 되는 객체에서 상속을 사용한다. (예, SomeActionListener의 객체는 ActionListener 인터페이스를 상속하고 있다.)

그런데, 앞서 블로그 글에서 내린 결론은 "구현 상속 보다는 (인터페이스 상속을 사용한) 객체 조합을 선호하라"인데, 이 문장만 보면, Erich Gamma가 전달하고자 했던 "조립 대상이 되는 객체가 (인터페이스) 상속을 사용해서 구현"한다라는 의미가 잘 드러나지 않는다. 


링크의 글에서 정확하게 어떤 내용으로 "Favor Object Composition (with Interface Inheritance) over Implementation Inheritance."라고 했는지 모르겠지만(정말, 이 문장만으로는 정확하게 무엇을 말하는지 잘 모르겠다), 링크의 글을 보는 분들은 Erich Gamma가 말한 "Composition is using inheritance"라는 문장을 오해 없이 이해하길 바란다.

Posted by 최범균 madvirus

댓글을 달아 주세요