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관계
HAS-A 관계
{
총 _총;
}
과 같이 클래스 내에 다른 클래스를 "포함" 함으로써 기능적인 것을 사용하고자 했을 때,
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; // 경찰이 총을 소유한다. 이제 경찰은 총이 가진 기능을 사용 할 수 있게 된 것이다.
}