본문 바로가기

Study/C++

[C++] Inheritance

상속

  • 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