fullstack

[C++] 상속의 조건. is-a 와 has-a

Language/C++

상속의 조건에는 is-a 관계에 의한 상속과 has-a 관계에 의한 상속이 있다.




- is-a 관계에 의한 상속


is-a 관계에 의한 상속은 "~은 ~이다." 가 성립되는 관계를 말한다. 예를 들어 보자.


" A student is a person. " (학생은 사람이다)


위의 예에서 student가 Derived 클래스, person이 Base 클래스가 되는 것이다. 

Derived 클래스는 Base 클래스의 모든 멤버를 상속받기 때문에  모든 student는 person의 특징을 지니게 되는 것이다.

만일 반대로 "A person is a student." 라고 한다면 모든 사람이 학생은 아니기 때문에 이는 성립하지 않는다.


위 예를 코드로 나타내면 다음과 같다.


1
class Person : public Student





- has-a 관계에 의한 상속


has-a 관계에 의한 상속은 "~은 ~을 소유한다." 가 성립되는 관계를 말한다. 예를 들어 보자.


" The student have a book. " (학생은 책을 소유한다)


위의 예는 다음과 같이 코드로 나타낼 수 있다.


1
class Student : public Book


이처럼 상속은 소유를 표현하기 위해서도 사용될 수 있다.




- has-a 관계에 의한 포함


위에서 소유를 표현하기 위해서 상속을 사용하였는데, 이는 포함을 통해서도 표현할 수 있다.


1
2
3
4
5
6
class Student
{
    Book book;
public:
    void readBook() { book.read(); }
};



클래스 객체 멤버로 Book을 Student 클래스 안에서 선언하였다.
위에 예제처럼 상속을 사용하지 않고도 소유를 표현할 수 있다.

그럼 어떤 것이 좋은 방법이라고 할 수 있을까?
상황에 따라 다르겠지만 상속에 의해 소유를 표현하게 되면 결합도가 높아지게 된다.(객체지향에서 결합도는 낮을수록 좋다)
따라서 has-a 관계에서는 상속 관계 보다는 포함 관계를 사용하는 것이 좋다고 할 수 있다.


'Language > C++' 카테고리의 다른 글

[C++] 오버라이딩 (Overriding)  (0) 2015.12.24
[C++] 객체 포인터  (0) 2015.12.22
[C++] 상속 (Inheritance)  (0) 2015.12.03
[C++] mutable 키워드  (0) 2015.12.03
[C++] explicit 키워드  (0) 2015.12.02