이번 항목은 객체지향 기술은 무엇이 있고, 어떻게 사용되어야 하는가? 에 대한 것이다.

두 가지 종류의 통신 세션을 가진 네트워킹 어플리케이션이 있고, 각 세션은 자신의 메세지 프로토콜을 가지며, 각 세션은 스스로가 전송을 담당한다고 보자. 그래서 코드를 짜면 아래와 같을 것 이다.

 각 DoMsg() 멤버 함수들은 일반적인 작업을 하기 위해 BasicProtocol::Basic() 함수들을 호출한다. 하지만 DoMsg() 함수는 스스로가 전송을 한다. 각 클래스의 추가적인 멤버를 가지고 있을 수 있지만, 중요한 멤버들은 다 보여졌다고 가정하자.


이제 이 디자인에 대한 평가를 내려보길 바란다.


분석

 잘 보면, BasicProtocol 을 protoco1과 protoco2가 public 상속을 하여, BasicProtocl 을 사용하여 각 프로토콜은 일을 처리한다. 그리고 각 프로토콜 스스로가 전송을 담당하고 있다.

바로 여기에 함정이 들어 있다. 바로 코드만을 재사용하기 위해 public 상속을 사용한 것이다. 물론 코드를 재사용 하는것은 좋지만, public 상속을 사용하는 비용에 비해 코드만 재사용하는것은 분명 과소비 일 것이다.

그렇다면 왜 과소비이고, 어떻게 상속 해야 하는지 알아 보자.

과소비로 꼽히는 것은

  1. public 상속으로 인해 그 의존성이 정말 끈끈해 지는 비용
  2. 이름 정의해야 하는 것에 대해 스트레스를 받아야 하는 비용
  3. public 상속으로 IS-A 관계로 오해 되는 비용
  4. 가상 함수도 없으면서, 마치 컨트롤 할 수 있을 것 같은 오해 비용
  5. 가상 소멸자로 만들어야 될 것 느낌을 지울 수 없게 만드는 비용
  6. public 상속의 진정한 의미를 아는 사람 마음을 괴롭게 하는 비용
  7. 사수에게 혼나야 하는 비용
  8. 등등등..

그렇다면, 어떻게 상속 해야 할까?

쉽게 생각하자. 그냥 객체를 내부에서 가져서 그 객체를 사용함으로써 구현되는 HAS-A 상속으로 하는 것이다. 모든 public 상속에 따른 과소비를 정당한 소비로 만들어 줄 것이다.


총평

쓴 돈에 비해 얻게 되는 효과가 적을 경우, 돈을 헤프게 썼다는 사실을 알게 될 것이다. 이것은 정말 마음을 아프게 한다. 회사 입장에서 본다면, 당장 결제 중지가 떨어질 것이다.

이 처럼 단순한 코드의 재사용만을 위하여 public 상속을 하는 것은 정말 헤프게 상속을 남용 하는 것이다. public 상속의 의미대로, 개념자체를 상속해야 되는 경우가 적합하게 들어 맞는 경우가 많이 있었다.

예를 들자면 "사람" 클래스를 정의하고 "경찰" 클래스 정의 할 때 "사람"을 public 상속한다. 훈날, 경찰이 총을 쏴야 할때, "사람" 이 총을 쏜다. 고 정의만 해 둔다면, 경찰도 총을 쏘게 할 수 있을 것이기 때문이다.

이처럼 public 상속은 개념의 상속으로 봐야 한다. 이것을 사람들은 IS-A 관계 또는 WORKS-LIKE-A 관계, USABLE-AS-A 관계 등으로 부른다.

상속 디자인은 많은 경우가 있으므로, "프로그래머의 병법서[각주:1]" 를 참고하여 익히는게 좋을 듯 싶다.



  1. Effective C++, More Effective C++, Exceptional C++, More Exceptional C++, Exceptional C++ Style, Standard Template Library, Modern C++, The C++ Programming Language, C++ 리팩토링, 실용주의 프로그래머, 등 좋은 병법서는 서점에 있다. [본문으로]
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기