본문 바로가기
C++

상속의 조건

by 상레알 2009. 1. 19.
처음 C++을 공부하고 클래스를 설계하는 학생들의 경우, 대부분 상속을 적용해야만 한다는 중압감에 시달린다고 한다.
물론 객체 지향에서 중요한 역활을 차지하고 있지만 해야하는 이유가 충분치 않은 상황에서의 상속은 오히려 해가 될 수도 있다. 상속은 장점도 있지만, 잘못된 상속의 경우 클래스의 관계를 복잡하게 만든다는 단점도 있기 떄문이다.

상속은 문법적으로만 익숙해서는 전혀 쓸모가 없다. 상속의 장점과 단점을 이해하고 적절한 경우에만 상속을 하는 판단력을 길러야 한다.



문제 상황에 따른 좋은 클래스 디자인 모델의 집합을 가리켜 "Design Patterns" 이라고 한다. Design Patters"을 공부하게 되면 상속이 지니는 파워를 다른 측면에서 실감할 수 있다.

[IS  - A ] 관계

Base 클래스와 Derived 클래스간에 IS-A 관계가 성립이 된다//

-건축 설계하는 엔지니어들은 그들만의 설계 기호가 있고, 회로를 설계하는 엔지니어들도 약속된 형태의 설계 기호 가 존재한다. 이처럼 객체지향에서도 소프트웨어의 설계를 위한 약속된 형태의 기호가 존재하는데 이를 가르켜 UML이라 한다.
[class Student  : public Person]
[class Airplane : public Vehicle]

"A student is a person."
"An airaplane is a vehicle."
->" 학생은 (일종의)사람이다."
   "비행기는 (일종의) 탈것이다."

이것이 바로 IS-A 관계이다. 즉" ~은~이다."가 성립이 되면 IS-A관계가 성립된다고 이야기 한다. 위와 같은 경우에는 IS-A 관계가 성립이 된다. 예를 들어서 지나가는 학생을 보고 다음과 같이 이야기 했다고 가정을 해보자
"넌 사람이야!"
맞는 말인가? 틀린말인가? 당연히 맞는 말이다. 마찬가지로 비행기를 가리켜 다음과 같이 말을 해도 항상 맞는 말이 된다.
"저것은 탈것이다." 하지만 그 역은 성립되지 않는다. 지나가는 사람을 대상으로 " 넌학생이야 " 라고 말했을 경우, 맞을 수도 있지만, 그렇지 않을수도 있기 떄문이다.(즉 항상 성립하는 것이 아니다.) 마찬가지로 이 세상의 모든 탈것은 다 비행기가 아니므로 역시 성립하지 않는다.
뭐 반대로 해서 클래스를 만든다면 문법상오류는 없을수 있지만 현실 세계와 전혀 동떨어진 형태로 클래스를 디자인하게 되면, 좋은 프로그램을 만들 수 없다. 문법적으로는 문제가 없기 때문에 컴파일은 잘 될지 모르지만, 원하는 형태의 프로그램은 결코 만들어 내지 못한다.

[HAS-A(have-A)관계에 의한 상속! 그리고 대안! ]

상속은 IS-A 관계에 의해서만 형성되는 것은 아니다.(하지만 대부분의 상속은 IS-A관계에 의해 형성된다.) 여기 또 하나의 상속 관계인 HAS-A(HAVE-A) 관계에 대해서 소개하겠다. HAS-A는 소유의 개념이 강하다.
"he police have a cudgel"
-> "경찰은 몽둥이를 소유한다."

상속을 통해서  Police 클래스는 몽둥이를 사용할수 잇게 한다.   이처럼 상속은 소유를 표현하기 위해서도 사용된다.

포함관계- 위처럼 has-a 관계로 소유가 될수도 잇지만 포함관계에서도 소유 표현을 할수도 잇다.
ex)

class cudgel{};
class police{
cudgel cul;
public:
void use weapon(){ cul.swing(); }
};
위와 같이 클래스의 멤버로 객체 선언이 올수도 있다. 이러한 객체를 가리켜 클래스 객체 멤버 (객체 멤버)라고한다.
police 객체는 cudgel 객체를 포함하고 있다. 즉 객체 멤버를 통해서 몽둥이를 소유하고있는 경찰이 표현된 것이다.
여기서 한가지 주의할 사항이 있다. 위처럼 객체 벰버가 되기 위해서는 void 생성자가 존재해야한다. 왜냐하면 객체 멤버가 메모리 공간에 할당되는 과정에서 void  생성자를 호출하기 때문이다.

HAS-A 관계는 하나의 객체가 다른 하나의 객체를 소유하는 관계를 말한다. 이또한 상속을 통해서 표현이 가능하다. 그러나 상속이 아닌 다른 방법을 통해서도 표현이 가능하다. 그렇다면 어떻방법이 좋을까?
물론.. 상황마다 다르긴 하지만  일반적으로 상속이 아닌 다른 방법이 주로 선택된다. 왜냐하면 상속에 의해서 소유를 표현하게 되면 두 클래스 간의 결합도가 높아지기 떄문이다.