본문 바로가기

C++

Chapter 4. 상속(Inheritance)

Chapter 4. 상속(Inheritance)
1. 상속이란
 - 상속은 객체지향의 주요 특성인 모듈의 재사용과 코드의 간결성을 제공한다.
 - 상속은 확장의 개념으로 상위 Class의 모든 요소를 상속받고 추가 요소를 더 가지는 개념이다.
 - 상속은 다중으로 사용할 수 있으며 이를 다중상속이라 한다.
 - 상속의 관계

  ‧ 상속 관계는 상속을 받는 Class와 상속을 해주는 Class로 나뉜다.
  ‧ 자식 Class가 상속 받는 방법은 Class 이름 뒤에 콜론(:)을 붙이고 상속할 Class 이름을 붙인다.
  ‧ 상속 해주는 Class : Base Class, Super Class, 부모 Class
  ‧ 상속 받는 Class : 파생 Class, Sub Class, 자식 Class

 

2. 상속의 특징
 - 접근제어
  ‧ 상속 관계에서도 접근제어는 유효하며 접근방법도 같다.
  ‧ 접근제어의 범위 : private < protected < public

예약어

범위

public

 선언된 Class 내외 어디서든 접근 가능

private

 선언된 Class 내에서만 사용가능

protected

 자신의 Class 내와 상속된 Class까지만 접근 가능

 - 상속제어
  ‧ 상속 제어는 Class를 상속 받을 때 상속 받을 Class의 접근제어를 결정하며 세 가지의 상속제어가 존재한다.

예약어

범위

public

 Super Class의 멤버 변수의 접근 제어를 그대로 물려받는다.

private

 Super Class의 public 멤버 변수를 protected로 변경해서 물려받는다.

protected

 Super Class의 모든 멤버 변수를 private로 변경해서 물려받는다.

 - 생성자 호출 순서
  ‧ 상속 받은 Sub Class에서 생성자가 실행될 때 Super Class의 생성자가 먼저 실행된 후 Sub Class의 생성자가 실행된다.
 - 상속 Class의 객체 형 변환
  ‧ 상속 관계에서 Super Class 변수는 Sub Class 변수에 대입 불가능
  ◦ Sub Class 변수에 Super Class 변수를 대입하려고 하면 Super Class의 멤버 변수에 Sub Class가 직접 접근이 불가능해 대입이 불가능하다
  ‧ 상속 관계에서 Sub Class 변수는 Super Class 변수에 대입 가능
  ◦ Super Class 변수에 Sub Class 변수를 대입할 땐 Sub Class 생성자가 Super Class 생성자로 만들어 지기 때문에 대입이 가능하다.
 - 상속 관계에서의 함수 오버라이딩(Overriding)
  ‧ 상속 관계에서 Sub Class에서 Super Class의 함수를 재 정의해 사용할 때 Class 변수가 Sub Class 변수라면 Sub Class에 재 정의된 함수가 호출된다.
  ‧ 함수를 재 정의할 때는 Super Class의 함수와 Sub Class의 함수가 이름과 매개변수가 동일해야한다.
 - Binding
  ‧ 함수 호출과 실제 함수를 연결하는 방법을 말하며 동적(Dynamic) Binding과 정적(Static) Binding으로 나뉜다.
  ‧ C++는 기본적으로 정적 Binding을 수행한다.
  ‧ 동적 Binding을 사용하려면 virtual 예약어를 사용해 함수를 정의해야한다.

 

3. Virtual
 - 가상 함수(Virtual Function)

  ‧ 정적 Binding을 할 때 사용하는 예약어인 virtual으로 선언된 함수
  ‧ 일반 함수 : 컴파일 호출할 함수의 데이터형을 보고 호출할 함수를 결정
  ‧ 가상 함수 : 실행할 때 포인터가 가리키는 데이터형에 따라 호출할 함수를 결정
  ‧ 가상 소멸자(Virtual Destructor)
  ◦ virtual로 선언된 생성자 함수는 동적 할당이 되는 함수이기 때문에 동적 할당을 해제해야 하는데 이때 쓰이는 함수를 말한다.
  ◦ 가상 소멸자를 정의해 주지 않으면 메모리 누수가 발생한다.
 - 순수 가상 함수(Pure Virtual Function)
  ‧ 함수의 정의 없이 선언만 되어 있는 가상 함수
  ‧ 오버라이딩(Overriding)의 관계를 목적으로 정의된 함수들은 사용될 내용과 형식, 용도가 같아 정의 내용이 필요 없기 때문에 순수 가상 함수로 선언한다.
  ‧ 가상 함수의 선언 뒤에 =0을 붙이면 순수 가상 함수가 된다.
  ‧ 추상(Abstract) Class
  ◦ 하나 이상의 멤버 함수가 순수 가상 함수인 Class
  ◦ 추상 Class는 함수의 정의가 생략되어 완전한 Class가 아니기 때문에 객체화 하지 못한다.