상속
- C++의 상속은 사전에 정의해 놓은 클래스를 다시금 활용하기 위한 목적으로 만들어진 문법적 요소이다.
- 클래스를 정의한 뒤, 해당 클래스에 존재하는 변수를 수정하는 등 데이터를 추가적으로 처리하기 위해서는 어떠한 방법이 유리할까?
- 보통 이러한 경우를 위해 사용하는 클래스를 '컨트롤(Control) 클래스' 혹은 '핸들러(Handler) 클래스'라고 하며, 이러한 클래스는 기능의 처리를 실제로 담당하는 클래스 전체를 의미한다. 아래 이미지가 일반 클래스와 컨트롤 클래스의 의미를 추상적으로 보여준다.
- 이러한 핸들러 클래스는 보통, 처리하고자 하는 클래스를 '상속'하면 프로그램을 더 OOP하게 할 수 있다.
만일, Student Clss에 추가적인 변수 혹은 함수가 추가되고, 이를 별도의 Handler로 조정하여 프로그램을 사용하고 싶다면, 단순히 Student에는 원하는 변수 혹은 함수를 추가하고, 이를 조정할 Handler Class에 추가적인 함수만 기입해주면 되는 것이다.
- C++의 접근제어 지시자의 종류와 범위는 다음과 같다.
private < protected < public |
- protected의 경우 다소 애매한 포지션에 위치하여 있는데, 보통의 경우 클래스 내부에 선언된 protected는 private와 차이를 보이지 않는다. 둘 다 클래스의 외부에서는 접근이 불가능하고, 클래스 내부에서만 접근을 지원하기 때문이다.
- Protected의 경우, 상속되었을 때 진가를 발휘한다. Protected로 선언된 멤버변수는 이를 상속하는 유도 클래스에서 접근이 가능하기 때문이다.
private | protected | public | |
범위 | private < protected < public | ||
외부 접근 | 불가능 | 불가능 | 가능 |
내부 접근 | 가능 | 가능 | 가능 |
유도클래스 접근 | 불가능 | 가능 | 가능 |
- 이러한 접근제어 지시자는 상속의 결과 또한 변화시킨다.
상속 접근 지정자 | 기초 클래스 | 기초 클래스로의 상속 형태 |
public | public | public |
private | 접근 불가능 | |
protected | protected | |
private | public | private |
private | 접근 불가능 | |
protected | private | |
protected | public | protected |
private | 접근 불가능 | |
protected | protected |
- 위 표는 상속 접근 지정자에 따른 기초 클래스별 유도 클래스의 상속 형태를 나타낸 것이다.
- 정리하면 다음과 같다.
- protected 상속의 의미는, protected보다 접근의 범위가 넓은 멤버는 protected로 변경시켜서 상속하겠다.
- private 상속의 의미는, private보다 접근의 범위가 넓은 멤버는 private로 변경시켜서 상속하겠다.
- public 상속의 의미는, public 보다 접근의 범위가 넓은 멤버는 public으로 변경시켜서 상속하겠다.
즉, private을 제외한 나머지는 그대로 상속한다.
- 단, public 상속을 제외한 다른 상속은 다중상속을 제외하면 잘 쓰이지 않는다.
- 상속을 알았다면, 상속을 위한 조건을 더욱 자세히 알아두어야 할 필요가 있다. 바로 'IS-A'관계의 성립이다.
- IS-A는 추상화들 사이의 포함 관계를 의미한다.
A는 B이다. |
- 즉, 상속관계가 성립하기 위해서는 기초 클래스와 유도 클래스간에 IS-A관계가 성립되어야 한다.
- 이와 반대로, 'HAS-A'관계도 존재한다. 이는, 일종의 구성관계로 한 오브젝트가 다른 오브젝트에 속하는 것(belongs to)을 의미한다. HAS-A관계는 상속을 사용하지 않는다. 이러한 관계는 다른 클래스의 기능을 받아들여 사용한다.
'Study > C++' 카테고리의 다른 글
[C++] Virtual principle and Multiple Inheritance (0) | 2023.10.10 |
---|---|
[C++] Polymorphism (0) | 2023.10.09 |
[C++] Static (0) | 2023.10.06 |
[C++] Friend (0) | 2023.10.06 |
[C++] Init (0) | 2023.10.06 |