클래스에 있어, 상속은 매우 강력한 기능 중에 한가지 이며, 매우 위험한 기능 중에 한가지 이다. 매우 위험한 기능이라 표현한 이유는 상속에 따른 문제점이 우후죽순처럼 불거지기 때문이다. 어쩔때 보면, 너무 불거저서 모두 빨간색으로 보일 때도 있었다. (.. 잘못된 상속은 그만큼 위험하다는 뜻입니다.)
이번 항목은 이런 상속 중 "is-implemented-in-terms-of" 상속이 무엇이며, 구현 방법 중 어느 것이 더 좋을 지에 대한 논의(일반적인 생활에 논의라는 말은 안쓰이는데, C++ 책에서는 무척 많이 나온다. 곰곰히 생각해 보니, "이야기"는 단방향인거 같고, 상호작용하며 이야기 하여, 결론에 도달하는 말 자체가 "논의"로 쓰기에 딱 좋은거 같다. ) 이다.
질문 1.
"is-implemented-in-terms-of" 는 무엇을 의미 하는가?
질문 2.
C++ public 상속이 아닌 private 이나 protected 상속, 그리고 HAS-A 관계로 "is-implemented-in-terms-of"를 표현 할 수 있는데, 이들 중 예외에 안전하게 꾸미기 좋은게 무엇인가?
해설
질문 1
"is-implemented-in-terms-of" 는 ~을 사용하여 ~을 구현하다 로 표현했는데, public 상속과 차이가 심하게 보인다. public 은 IS-A 관계까 명확하여, B is a A 라고 했을때 A객체를 받아 구현된 모든 함수들에 있어 B객체가 들어가도 문제가 일어나지 않을 때, 사용되는 초강력 상속 이다. (의존성 이야기를 하자면, .. 다 강력하겠지만 말이다.)
하지만 "is-implemented-in-terms-of" 상속은 그 상속되는 객체 자체를 사용해서 자신을 구현했다는 뜻이다. 즉 A와 B는 전혀 다른 존재이다. 예를 들면 바퀴, 엔진등을 사용하여, 자동차를 구현했다는 뜻이다. 이때 바퀴가 자동차나 엔진이 아니다. 각 독립적인 요소로 느낄 수 있을 것이다. 이런 상속을 바로 "is-implemented-in-terms-of" 라고 불른다.
질문 2
해당 이야기는 저번 책에서 아주 길게 이야기 했으므로, 생략하고 요점만 짚어 본다.
소프트웨어 공학 규칙 중 하나는 "결합도를 최소화 한다. 이것은 하나 이상의 표현 방법이 있을때 최우선으로 고려해야 할 사항 중에 하나이다"
상속 자체가 워낙 초강력 관계이기 때문에, 동일하게 표현 될 수 있다면, HAS-A 관계가 좋다. 그렇다고 무조건 HAS-A 관계를 사용 하면 안된다. 저번 exceptional C++ 에서 이 이야기에 대해서 길게 이야기 했는데, 이 참에 링크를 걸고 끝마치려 한다.
관련 링크 : http://www.ikpil.com/692
총평
정말 상속은 사용자 조차에게도 벌벌 떨게 만드는 무기이다. 대체 상속은 왜 만든거야? 라고 생각할 수도 있지만, .. 칼을 잘 쓰면 좋은 요리를 만드는 제일 좋은 도구이듯이, 강력함은 언제나 제어할 수 있을 때 갖는게 좋은거 같다. 1억이 있다 해도, 그 1억을 제어 할수 없으면 매우 불편한 가치이다. (.. 그래도 1억이라면, ㅋ 상속도 이런 가치이지 않을까? 한다. 진짜 1억이라면...ㅋ )
'책 정리 > More Exceptional C++' 카테고리의 다른 글
항목 40 : 네임스페이스 Part 2 : 네임스페이스로 마이그레이션(migration) (난이도 : 4) (0) | 2008.12.08 |
---|---|
항목 39 : 네임스페스 Part 1 : using 선언과 using 지시자 (난이도 : 2) (1) | 2008.12.08 |
항목 38 : typedef (난이도 : 3) (0) | 2008.12.08 |
항목 37 : 전방 선언(forward dclarations) (난이도 : 3) (0) | 2008.12.08 |
항목 36 : 초기화 (변수 초기화, 생성자의 문제점) (난이도 : 3) (0) | 2008.12.07 |
항목 22 : 예외 안전 클래스 설계 Part 1 : 복사 지정 연산(copy assignment) (난이도 7) (0) | 2008.12.06 |
항목 21 : 관리되지 않은 포인터 문제 Part2 : auto_ptr은? (난이도 8) (0) | 2008.12.06 |
항목 20 : 관리되지 않은 포인터 문제 Part 1: 매개변수 (난이도 6) (0) | 2008.12.06 |
항목 19 : 처리되지 않은 예외 (0) | 2008.12.04 |
항목 18 : 생성자 실패 Part2 : 흡수? (0) | 2008.12.03 |
최근댓글