본문 바로가기

Programming Study/C++

상속(Inheritance)의 이해

1. 상속에 들어가기에 앞서

과거의 상속의 개념

  - 기존에 정의해 놓은 클래스의 재활용을 목적으로 만들어진 문법적 요소가 상속이다.

 

컨트롤 클래스

  - 기능의 처리를 실제로 담당하는 클래스를 가리켜 '컨트롤 클래스' 또는 '핸들러 클래스'라 한다.

  - 기능 제공의 핵심이 되기 때문에 모든 객체지향 프로그램에서 반드시 존재하는 클래스이다.

 

소프트웨어의 설계에 있어 중요시 하는 것들 중 하나

  - 요구사항의 변경에 대응하는 프로그램의 유연성

  - 기능의 추가에 따른 프로그램의 확장성

 

 

2. 상속의 문법적인 이해

용어의 정리

 

유도클래스의 객체 생성과정

유도 클래스의 객체생성 과정에서 기초 클래스의 생성자는 100% 호출된다.

유도 클래스의 생성자에서 기초 클래스의 생성자 호출을 명시하지 않으면, 기초 클래스의 void 생성자가 호출된다.

 

유도 클래스 객체의 소멸과정

유도 클래스의 객체가 소멸될 때에는, 유도 클래스의 소멸자가 실행되고 난 다음에 기초 클래스의 소멸자가 실행된다.

스택에 생성된 객체의 소멸순서는 생성순서와 반대이다.

상속과 연관된 클래스의 소멸자는 다음의 원칙을 지켜서 정의해야 한다.

생성자에서 동적 할당한 메모리 공간은 소멸자에서 해제한다.

 

 

3. protected 선언과 세가지 형태의 상속

protected로 선언된 멤버가 허용하는 접근의 범위

C++의 접근제어 지시자는 private, protected, public 이렇게 세가지가 존재한다.

그리고 이들이 허용하는 접근의 범위에는 다음의 관계가 있다.

private < protected < public

protected로 선언된 멤버변수는 이를 상속하는 유도 클래스에서 접근이 가능하다.

그리고 이것이 private과 protected의 유일한 차이점이다.

protected 선언은 private과 public에 비해 그리 많이 사용되지 않는다.

물론 유도 클래스에게만 제한적으로 접근을 허용한다는 측면에서 유용하게 사용될 수 있는 키워드이다.

하지만 기본적으로는 기초 클래스와 이를 상속하는 유도 클래스 사이에서도 '정보은닉'은 지켜지는게 좋다.

 

세가지 형태의 상속

protected 상속

  - protected보다 접근의 범위가 넓은 멤버는 protected로 변경시켜서 상속하겠다.

private 상속

  - private보다 접근의 범위가 넓은 멤버는 private으로 변경시켜서 상속하겠다.

public 상속

  - public보다 접근의 범위가 넓은 멤버는 public으로 변경시켜서 상속하겠다.

  - private을 제외한 나머지는 그대로 상속한다.

 

public 이외의 상속은 다중상속과 같이 특별한 경우가 아니면 잘 사용하지 않는다.

 

 

4. 상속을 위한 조건

상속을 위한 기본 조건인 IS-A(일종의 ~이다) 관계의 성립

상속의 기본 문법에서 보이듯이, 유도 클래스는 기초 클래스가 지니는 모든 것을 지니고,

거기에다가 유도 클래스만의 추가적인 특성이 더해진다.

상속관계가 성립하려면 기초 클래스와 유도 클래스간에 IS-A 관계가 성립해야 한다.

만약에 상속관계로 묶고자 하는 두 클래스가 IS-A 관계로 표현되지 않는다면,

이는 적절한 상속의 관계가 아닐 확률이 매우 높은 것이니, 신중한 판단이 필요하다.

 

HAS-A(~을 소유한다) 관계도 상속의 조건은 되지만 복합 관계로 이를 대신하는 것이 일반적이다.

HAS-A 관계도 상속으로 표현할 수 있다.

그런데 이러한 소유의 관계는 다른 방식으로도 얼마든지 표현이 가능하다.

 

상속으로 묶인 클래스는 강한 연관성을 띤다.

상속은 IS-A 관계의 표현에 매우 적절하다.

경우에 따라서는 HAS-A 관계의 표현에도(소유 관계의 표현에도) 사용될 수 있으나,

이는 프로그램의 변경에 많은 제약을 가져다 줄 수 있다.

 

 

 

- 윤성우 저, 열혈강의 C++ 프로그래밍 中 -