Pattern이라는 분야에서 GoF의 Design Pattern이 가지는 의미는 매우 귀중하다.

사용자 삽입 이미지

GoF Design Pattern

학회에서나 애기되어지고 있는 Pattern이라는 것들을 일반인 들에게 알리는 하나의 신호탄 같은 존재인 것이다.

오늘 이 중요한 Design Pattern의 두번째 Principle에 대한 몇가지 오해들을 정리해 보고자 한다.

Favor Object Composition over Class Inheritance

이 말의 의미는 원문 그대로 해석을 한다면 클래스 상속보다는 객체 조합을 선호해라 라는 애기다.

그런데 대부분의 시중에 나와 있는 책들이 상속보다는 조합을 선호하는 것으로 의미를 파악하고 애기를 하고 있다.

과연 이것이 맞는 말일까?


4년 동안 거의 패턴에 대한 책들을 본 경험을 들어 볼때, 상속이라는 것은 모든 패턴에 사용되고 있었다. 

디자인 패턴의 첫번째 원칙인 Program to an interface, not to an implementation 에서도
Program은 인터페이스 지향적으로 짜야 된다는 의미가 나와 있고,
이것은 곧 상속을 의미하는데 왜 상속보다 구현을 선호하라고 했을까?

지금 한번 패턴책을 펴보길 바란다.

어느 패턴이라도 인터페이스 상속을 받지 않은 패턴을 찾기 힘들 정도 인데
과연 상속 보다 조합을 선호하는 이분법적인 사고가 맞는 걸까?

필자는 그래서 짧은 영어 실력으로 Favor Object Compoistion over Class Inheritance를
클래스 상속을 기반으로한 객체 조합을 선호해라 라는 의미로 해석을 시도했다.

상당히 그럴싸 하지 않은가?  물론 필자의 영어 실력이 그리 뛰어난 편은 아니지만
왠지 상속을 기반으로 한 조합 이라는 의미를 부여했을때, 좀더 GoF Design Pattern에 맞게 해석된것 같이 느낄수가 있었다.

그리고 필자는 계속 스터디를 하면서 이 생각이 맞다고 결론을 내리고 있었다.
그런데 컴퓨터 분야에 유명한 번역가이신 분에게 반론이 들어왔다.

Favor Object Composition over Class Inhertance는  클래스 상속보다는 객체 조합을 선호해라 라는 의미가 맞다고.  그분이 워낙 컴퓨터 영역에서는 전문가 이시라.
여러가지 예를 들며 애기를 온라인 상으로 나누게 되었다.

그런데 대학원에서 분산 객체와 패턴을 전공으로 하고, 스터디를 2년동안 해왔는데.
과연 저말이 맞는 걸까? 상속보다 객체 조합이 훨씬 나은 거라고 말할수 있는 걸까?

왜냐면 객체지향 초기에 가장중요시 여기는 개념은 재사용성(Reusability )였다.

하지만 지금은 워낙 시스템이 방대해지고 잦은 변화가 발생하다보니 유연성(Reflexiblity)이 더 중요한 개념으로 여겨지고 있다.

유연성을 가장 쉽게 확보하는 방법이 상속을 통해서 다양한 Concrete Class를 만드는 방법인데.
객체 지향에 과연 저 말이 맞는 의미일까?

다시 생각하게 되었다.   그런데 웹 서핑중 재미난 글을 발견하게 되었다.  
 http://www.artima.com/lejava/articles/designprinciplesP.html

사용자 삽입 이미지

Eric Gamma

 바로 GoF Design Pattern의 창시자인 Erich Gamma의 최신 인터뷰 내용이었다.

  두번재 원칙인 Favor Object Composition over Class Inhertance 에서   Object Composition은 내부적으로 상속을 안 사용 한다는 의미가 아니다.

  Object Composition은 내부적으로 Interface Inheritance를 사용하고 있다는 말로 깔끔하게 설명을 했다.

  필자가 저런말을 하니 뭔가 다시 한번 Design Pattern 책을 살펴볼 필요가 있다는 생각이 들었다.

  그런데 단지 두번째 원칙 몇페이지 앞에 재미난 말을 발견했다.


 P. 17 세번째 단락. (GoF Design Pattern 원서..)

  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.

두번째 원칙의 Class Inheritance는 Implementation Inheritance 였던 것이다.


아마 이 두번째 원칙의 잘못된 오해 때문에, 조합이 좋다라고 단언하는 책이나 사람들이 있다.

국내 서적에서 상속보다 조합이 더 낫다라고 해석한 몇분의 지식 오류로 인해..
Composition한 부분만 너무 강조 된것이 아닌가 하고 걱정하게 되어 진다.

그럼 두번째 원칙을 다음과 같이 재정의 할수 있을 것이다.

Favor Object Composition(with Interface Inheritnace or subtyping)
                                     over Implmentation Inheritance (subclassing)

구현 상속 보다는 (인터페이스 상속-SubTyping 을 기반으로한 또는 요즘 시대에는 계약 기반의 ) 객체 조합을 선호하라는 말로 해석되어 질수 있을 것이다.

객체의 세계에서는 상속과 조합의 아름다운 결합을 추구하는 것이 패턴의 아름다운 진리인것이다.
이 글로 인해 많은 분이 Design Pattern의 두번재 원칙의 의미를 알기 바란다.

Posted by 빵수

BLOG main image
Eva네의 소프트웨어 이야기
Devpia Eva 팀입니다. 소프트웨어 설계,패턴, 최신 이슈들을 공유하는 장이 될것입니다. by 빵수

공지사항

카테고리

전체보기 (11)
아키텍쳐 (2)
패턴 (6)
새로운 기술들 (0)
소공이야기 (0)
컬럼 및 아티클 (1)
Eva네 (2)
문래예술 (0)

글 보관함

달력

«   2018/09   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
Total : 13,073
Today : 0 Yesterday : 0