{

이 글의 취지는 무엇인가? 

상속을 잘못되게 사용하지 말라는 것이다.


상속의 정확한 의미가 무엇일까?

상속은 말 그대로, 이어 받는 것을 말하는데, C++에선 상속해 주는 녀석의 행동을 이어 받는 것이다. 그래서 "is-a" 관계라 든지 "works-like-a" 라든지 상속은 이런 관계일 때만 해야 한다고 한다.

is-a 관계 :
B is a A 라는 관계인데, B가 A로 봐도 무리가 없다면, 상속을 해도 된다.(물론 상속을 하지 않아도 된다면 하지 않는게 좋다)

works-like-a 관계 :
B works like a A 라는 관계인데, B가 A 처럼 행동해야 할때, 상속을 해도 된다. 물론~ 하지 않아도 되면, 하지 않는게 좋다.


상속으로 코드의 재사용을 하면 안되는 이유가 무엇인가?

상속은 대체성을 위해서 사용 하는 것인데, 이 대체성은 class B : public A 관계 일 때, B가 A로 대체될 수 있는 것을 의미한다. 만약 A의 특정 코드만을 사용하기 위하여 상속을 사용 한다면, 대체성 관계가 성립되지 않는 상태에서 자칫 디자인이 꼬여 버리거나, 알수 없는 에러를 벹어 낼 수가 있다.

C++에서 상속은 대체성을 위해서 만들어 진것이기 때문에, B가 A처럼 행동하면 안되는데도, 문법적 오류를 벹어내지도 않으며, 디자인적 결함을 찾기도 힘들어 지므로, 전체적으로 디버깅이 어려워 진다.

코드를 재사용하고 싶다면 어떻게 해야 하는가?

템플릿이나, has-a 관계 를 사용하는게 좋을 것이다.


이것 때문에 어떤 나쁜 경험을 해 보았는가?

대체적으로 나는 코드를 재사용하기 위해서 상속을 써 본일이 없기 때문에, 잘 모르겠다. 나중에 겪게 될 것 같은 느낌이 팍팍 드는데, 그 때 다시 기회가 되면 정리하겠다.

}

저작자 표시
신고

'책 정리 > C++ Coding Standards : C++ 코딩의 정석' 카테고리의 다른 글

항목 42 : 내부의 것은 너무 노출시키지 말라. ( Don’t give away your internals. )  (0) 2009.03.31
항목 41 : 특징 없는 값의 집합을 제외하고는 모든 데이터 멤버를 사영으로 하라. Make data members private, except in behaviorless aggregates (C-style structs).  (0) 2009.03.31
항목 40 : 간접 변환을 피하라. ( Avoid providing implicit conversions. )  (1) 2009.03.30
항목 39 : 가상 함수는 비공용으로, 공용 함수는 비가상으로 설정하라. ( Consider making virtual functions nonpublic, and public functions nonvirtual. )  (0) 2009.03.30
항목 38 : 안전한 오버라이딩을 연습하라. ( Practice safe overriding. )  (0) 2009.03.02
항목 37 : 상속의 정확한 의미를 이해하자. 재사용을 위해 상속하는 것은 아니지만, 재사용은 필요하다. ( Public inheritance is substitutability. Inherit, not to reuse, but to be reused. )  (0) 2009.03.02
항목 36 : 추상 인터페이스를 활용하라. ( Prefer providing abstract interfaces. )  (0) 2009.03.02
항목 35 : 기반 클래스로 디자인되지 않은 클래스로부터의 상속을 피하라. ( Avoid inheriting from classes that were not designed to be base classes. )  (0) 2009.03.01
항목 34 : 상속성을 주의해서 사용하라. ( Prefer composition to inheritance. )  (0) 2009.02.28
항목 33 : 최소화된 클래스를 사용 하라. ( Prefer minimal classes to monolithic classes. )  (0) 2009.02.27
항목 32 : 만들고 있는 클래스가 무엇인지 확실히 하라. ( Be clear what kind of class you’re writing. )  (0) 2009.02.26
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요