Chap 7. 상속(Inheritance)의 이해
7-1. 상속에 들어가기에 앞서
상속의 문제 상황에 대한 예시 제시.
상속은 재활용을 위한 것이 아닌, 구체화(IS-A) 관계를 표현하기에 적절한 수단이다.
우리가 회사의 직원 봉급 관리 프로그램을 작성한다고 하였을 때,
직원의 데이터를 저장하는 Data 클래스와 이러한 Data 클래스들을 관리하는 Control 클래스를 작성하였을 때,
새로운 직원 형태(정규직, 알바, 인센티브 직, 등등)가 등장하면 기존의 Control 클래스에 많은 수정이 요구된다.
그렇지만 이 때 Super 클래스를 작성해두고 이를 관리하는 Control 클래스를 두고 Data 클래스들은 Super 클래스를 상속하는 Sub 클래스로 둔다면 손쉽게 해결이 가능하다.
7-2. 상속의 문법적인 이해
상속은 말 그대로, 물려주고 물려받는 관계를 말하는 것으로,
A 클래스 <- B 클래스
의 상속관계가 있을 경우 B 클래스는 A 클래스의 멤버 변수와 멤버 함수 + B 클래스 자체의 멤버 변수, 멤버 함수 를 지니게 된다.
그렇다면, 이 때 B 클래스의 생성자에서 A 클래스의 멤버 변수들도 초기화 해주어야 하기에, 예제와 같이 A 클래스의 생성자를 호출하여 초기화한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class A{ // 멤버 변수 private: int num1; // 멤버함수 public: A(int n1) :num1(n1){} }; // A 클래스를 상속하는 B 클래스 class B : public A{ // 멤버 변수 private: int num2; // 멤버함수 public: B(int n1, int n2) :A(n1), num2(n2){} }; | cs |
그리고 따로 sub 클래스에서 super 클래스의 생성자가 명시되어 있지 않을 경우 자동으로 void 매개변수로 super 클래스의 생성자를 호출한다(물론, A 클래스의 void 생성자가 정의되어 있지 않다면 컴파일 오류가 발생한다).
생성자와 더불어 소멸자도 마찬가지로 함께 호출되어지는데, 특정 객체의 소멸자는 특정 클래스에서 호출되는 것이 맞기에 이는 sub 클래스라든지 super 클래스에서 타 클래스의 소멸자를 호출하지 않는다.
단, 호출 순서는 Sub 클래스 - Super 클래스의 호출 순이다.
7-3. Protected 선언과 세 가지 형태의 상속
Protected 선언은 접근 수준 제어 시지자로 private과 유일한 차이점은 상속받은 class 에서 접근을 허용할 것인가에 대한 차이이다.
그리고 세 가지 형태의 상속이 있는데 다음과 같다.
1 2 3 4 5 6 7 8 | class B : public A {} // 접근 수준 제어 지시자를 그대로 상속, 단 private은 접근 불가 class B : protected A {} // protected 보다 넓은 범위의 접근 수준 제어 지시자를 protected로 변경, 단 private은 접근 불가 class B : private A {} // private 보다 넓은 범위의 접근 수준 제어 지시자를 private으로 변경, 단 private은 접근 불가 | cs |
7-4. 상속을 위한 조건
상속은 앞서 설명한 바와 같이 구체화의 관계, IS-A 의 관계 일 때 사용하는 것이 좋다.
노트북은 일종의(IS-A) 컴퓨터이다.
태블릿은 일종의(IS-A) 컴퓨터이다.
와 같이 일종의(IS-A) 관계일 때 사용해주는 것이 좋다.
물론 소유의 관계, HAS-A 관계 일 때도 사용할 수 있지만 이 때는 복합 관계가 더욱 적절한다.
(class 내부의 멤버 변수로 해당 클래스 pointer 를 가지는 것이 더욱 적절하다)
'Archived(CSE Programming) > cpp' 카테고리의 다른 글
Chap 9. 가상(Virtual)의 원리와 다중상속 (0) | 2019.01.10 |
---|---|
Chap 8. 상속과 다형성 (0) | 2019.01.09 |
Chap 6. friend와 static 그리고 const (0) | 2019.01.07 |
Chap 5. 복사 생성자(Copy Constructor) (0) | 2019.01.06 |
Chap 4. 클래스의 완성 (0) | 2019.01.05 |