상속

클래스 상속이란 기존에 정의된 클래스의 모든 멤버 변수와 멤버 함수를 사용할 수 있는 새로운 클래스를 만드는 것이다.

이는 기존에 존재하는 클래스를 재활용하거나 공통되는 파트를 제거할 수 있어 유용하다.

 

파생 클래스

파생 클래스에는 기초 클래스의 접근할 수 있는 모든 멤버 변수들이 저장되고 모든 멤버 함수들을 사용할 수 있다.

단, 기초 클래스의 private 멤버에는 접근할 수 없다.(즉, private 멤버가 존재한다면 초기화해줄 생성자는 필수!)

 


오버 라이딩

오버 로딩(overloading)은 서로 다른 매개변수를 갖는 여러 가지의 함수를 만드는 것인데,

오버 라이딩(overriding)은 이미 정의된 함수를 무시, 새롭게 같은 이름으로 만드는 것이다.

주의할 점은 오버 라이딩은 함수의 동작만 재정의하는 것이므로 함수의 원형은 같아야 한다.

 

방법은 두 가지이다.

  1. 파생 클래스에서 직접 오버라이딩
  2. 가상 함수를 이용해서 오버라이딩

파생 클래스에서 직접 오버 라이딩하는 것은 말 그대로다.

그렇지만 이는 문제 될 수 있는 상황이 있다.

    기초 클래스 *C
    기초 클래스 A
    파생 클래스 B

    C = &A
    C->오버라이딩된 함수---------------1
    C = &B
    C->오버라이딩된 함수---------------2

두 개의 결과는 기초 클래스의 함수가 호출된다.

이에 대한 이유는 C++의 컴파일러는 포인터의 타입으로 함수를 호출하기 때문이다.

 

이러한 문제 때문에 우리는 가상 함수를 이용할 수 있다.

파생 클래스에서 가상 함수(virtual)로 오버 라이딩했을 때 위의 예시를 사용하면,

A는 기초 클래스의 함수 호출, B는 파생 클래스의 함수 호출이 된다.

 

가상 함수(virtual)

기초 클래스에서 virtual을 사용하여 가상 함수를 선언하면, 파생 클래스에서 재정의된 멤버 함수도 자동으로 가상 함수가 된다.


다중 상속의 문제점

  1. 상속받은 기초 클래스들에서 같은 이름의 멤버가 존재할 수도 있다.
  2. 하나의 클래스를 간접적으로 두 번 이상 상속받을 가능성이 있다.
  3. 가상 클래스가 아닌 기초 클래스를 다중 상속하면, 기초 클래스 타입의 포인터로 파생 클래스를 가리킬 수 없다.

 


바인딩

C++ 컴파일러는 함수를 호출할 때 정확한 메모리 위치, 어느 블록에 있는 함수를 호출하는지 알고 있어야 한다.

그래서 어떤 블록인지 지정하는 것을 바인딩이라고 한다.

 

가상 함수가 아닌 멤버 함수는 정적 바인딩(컴파일 타임에 고정된 메모리 주소로 변환)을 하게 된다.

하나, 가상 함수는 프로그램이 실행될 때 객체를 결정하기에 컴파일 타임에 객체를 특정할 수 없다.

그래서 가상 함수는 런타임에 올바른 함수가 실행될 수 있게 동적 바인딩을 해주어야 한다.

 

이에 관한 이야기는 컴파일러마다 다르다.

일반적으로는 가상 함수들의 주소를 갖고 있는 가상 함수 테이블을 탐색하여 호출한다.

 


가상 소멸자

기초 클래스의 소멸자는 가상으로 선언해주어야 한다.

그 이유는 가상 소멸자로 선언이 되어있어야 호출된 클래스의 소멸자를 호출하지 않고 내부까지 소멸자를 호출하게 될 테니깐.

 


순수 가상 함수

순수 가상 함수는 가상 함수와 기능은 같지만 한 가지 제한점이 있다.

반드시 함수를 재정의 해야 한다는 점이다.

순수 가상 함수는 일반적으로 함수의 동작을 정의하는 함수가 없다.

그렇기에 파생 클래스에서 재정의하지 않으면 사용할 수 없다.

 


추상 클래스

하나 이상의 순수 가상 함수를 포함하는 클래스를 추상 클래스라고 한다.

추상 클래스를 상속받는 클래스는 가상 메소드를 반드시 구현하지 않아도 된다.

다중상속이 불가능하다.

 


인터페이스

인터페이스에서는 구현이 없으며 가상 소멸자와 순수가상함수만 포함되어있다.

인터페이스에서는 상태와 구현이 전혀 없다.

인터페이스를 구현하는 클래스는 인터페이스의 모든 메소드를 구현해야한다.

인터페이스는 다중상속이 가능하다.

'42일기' 카테고리의 다른 글

CPP [템플릿]  (0) 2022.03.02
CPP [캐스팅]  (0) 2022.02.25
MINIRT(1)  (0) 2022.01.12
Minishell(3)  (0) 2021.12.20
python Dict, set 활용  (0) 2021.10.15

+ Recent posts