본문 바로가기
프로그래밍/C++

IS-A, HAS-A 관계

by 리뷰하는 (게임)프로그래머_리프TV 2010. 3. 27.




IS-A, HAS(HAVE)-A 관계가

뭔가 문법적이고 코드적인 부분은 아니다.

약간은 개념적이고 추상적인 내용이지만,

딱히 어려운 내용은 아니니 특별히 소스코드 없이 개념적으로 한번 훑어 보자.


class 사람
class 학생 : public 사람

다음과 같은 형태가 IS-A 관계이다.

"모든 학생은 사람이다."

라는 말을 하였을 때 어색하지 않은 관계.

하지만

"모든 사람은 학생이다"

라고 했을 때에는 올바르지 않다.

이렇게 하위 클래스가 상위 클래스를 "포함" 하고 있는 관계를 IS-A 관계라 한다.

그렇다면 HAS-A 관계는 무엇인가.

"사탕을 소유한 어린 아이"
"무기를 소지한 강도"
"총을 가지고 있는 경찰"

정도가 HAS-A 관계라고 볼 수 있다.

사탕은 강도도, 어린 아이도, 경찰도 모두 소요 할 수 있고.
무기 또한 어린 아이도(?) 강도도, 경찰도 소유 할수 있고.
물론 총도, 어린...아...이도.. 강도도 경찰도 가질 수 있다.(물론 약간의 거부감이 들지도 모르지만 불가능 한게 아니다.)

class 총;

class 경찰
{
       총 _총;
}

과 같이 클래스 내에 다른 클래스를 "포함" 함으로써 기능적인 것을 사용하고자 했을 때,
HAS-A 관계를 이용한다.

음, 간단하게 나마 IS-A, HAS-A 관계를 코드로 살펴 보자.


IS-A관계
class Person
{
public:
	int age;		// 사람이라면 나이가 있고.
	char* name;		// 이름이 있을 것이다.
};

class Student : public Person
{
public:
	char* schoolAddres;	// 그 사람을 상속하면서, 학교의 주소나,
	char* major;		// 전공등을 학생은 추가로 가지고 있을 것이다.
};​

HAS-A 관계
class Gun
{
public:
	int Power;	// 총은 파괴력이나.
	int	shot;	// 탄약의 갯수등이 존재할 것이다.
};

// 만약 경찰이 Is-A관계로도 설정하고 싶다면. 
// public Person 클래스를 상속 받을 수도 있을 것이다.
class Police //: public Person 
{
public:
	Gun _gun;	// 경찰이 총을 소유한다. 이제 경찰은 총이 가진 기능을 사용 할 수 있게 된 것이다.
}​

'프로그래밍 > C++' 카테고리의 다른 글

객체 레퍼런스  (0) 2010.04.03
객체 포인터  (2) 2010.03.29
상속의 형태  (0) 2010.03.26
상속의 객체 생성, 소멸 과정  (0) 2010.03.26
상속의 개념  (0) 2010.03.24