상속(Inheritance)이란?
상속은 객체지향 프로그래밍(OOP)의 핵심 개념 중 하나로, 클래스 간의 관계를 정의하고 기능을 재사용하기 위해 사용합니다.
개념 자체는 비교적 이해하기 쉽지만, 실제 프로젝트에서 올바르게 사용하는 것은 다소 까다로울 수 있습니다.
상속을 사용하는 이유
상속을 사용하는 대표적인 목적은 다음과 같습니다.
1. 클래스 간의 관계 표현
상속은 부모 클래스와 자식 클래스의 관계를 표현할 때 사용됩니다.
예를 들어,
Animal
├── Cat
├── Dog
└── Human
처럼 "Cat은 Animal이다(Is-A 관계)" 를 표현할 수 있습니다.
2. 코드 재사용
부모 클래스에 공통 기능을 구현하면 자식 클래스에서 그대로 사용할 수 있습니다.
예를 들어 Animal 클래스에
- Sleep()
함수를 구현하면,
Cat, Dog, Human 클래스는 별도로 구현하지 않아도 해당 기능을 사용할 수 있습니다.
이를 통해 중복 코드를 줄이고 유지보수성을 높일 수 있습니다.
3. 인터페이스의 일관성
상속을 이용하면 여러 클래스가 동일한 인터페이스를 제공할 수 있습니다.
대표적으로
- 추상 클래스(Abstract Class)
- 인터페이스(Interface)
를 구현할 때 사용하며,
순수 가상 함수(Pure Virtual Function) 를 통해 인터페이스를 정의합니다.
4. 동적 함수 바인딩(Dynamic Function Binding)
상속의 가장 중요한 활용 목적 중 하나입니다.
virtual 함수와 Virtual Table(VTable) 을 이용하여
런타임에 실제 호출될 함수를 결정하는 다형성(Polymorphism) 을 구현할 수 있습니다.
실제 프로젝트에서는 단순한 코드 재사용보다
- 클래스 간의 관계
- 인터페이스 통일
- 다형성 구현
을 위해 상속을 사용하는 경우가 더 많습니다.
간단한 상속 예제
class Animal
{
public:
void Sleep();
};
class Human : public Animal
{
public:
void DriveCar();
};
Human 객체는
- Human만의 기능인 DriveCar()
- Animal로부터 상속받은 Sleep()
두 기능을 모두 사용할 수 있습니다.
즉,
Human
├── DriveCar()
└── Sleep()
와 같은 구조가 됩니다.
접근 지정자(Access Specifier)
클래스에서는 멤버의 접근 범위를 지정하기 위해 접근 지정자를 사용합니다.
- public
- protected
- private
public
외부에서도 자유롭게 접근할 수 있습니다.
class Base
{
public:
int value;
};
객체를 통해 직접 접근 가능합니다.
Base b;
b.value = 10;
private
클래스 내부에서만 접근 가능합니다.
외부에서는 직접 접근할 수 없으며,
Getter/Setter와 같은 public 함수를 통해 접근해야 합니다.
class Base
{
private:
int value;
public:
void SetValue(int v)
{
value = v;
}
};
protected
외부에서는 접근할 수 없지만,
상속받은 자식 클래스에서는 접근할 수 있습니다.
class Base
{
protected:
int value;
};
class Derived : public Base
{
public:
void Test()
{
value = 10; // 가능
}
};
상속 방식
상속에는 세 가지 방식이 있습니다.
- Public Inheritance
- Protected Inheritance
- Private Inheritance
1. Public 상속
class Derived : public Base
가장 일반적으로 사용하는 방식입니다.
접근 권한은 다음과 같이 유지됩니다.
| Base | Derived |
| public | public |
| protected | protected |
| private | 접근 불가 |
즉,
- public 멤버는 계속 public
- protected 멤버는 계속 protected
- private 멤버는 자식 클래스에서도 접근할 수 없습니다.
2. Protected 상속
class Derived : protected Base
접근 권한이 다음과 같이 변경됩니다.
| Base | Derived |
| public | protected |
| protected | protected |
| private | 접근 불가 |
즉,
Base의 public 멤버도 Derived에서는 protected처럼 동작합니다.
3. Private 상속
class Derived : private Base
접근 권한은 다음과 같이 변경됩니다.
| Base | Derived |
| public | private |
| protected | private |
| private | 접근 불가 |
즉, Base의 public과 protected 멤버 모두 Derived에서는 private으로 취급됩니다.
접근 권한 변화 요약
| Base 멤버 | Public 상속 | Protected 상속 | Private 상속 |
| public | public | protected | private |
| protected | protected | protected | private |
| private | 접근 불가 | 접근 불가 | 접근 불가 |
※ private 멤버는 어떤 방식으로 상속받더라도 자식 클래스에서 직접 접근할 수 없습니다.
핵심 정리
- 상속은 클래스 간의 관계를 표현하고 코드를 재사용하기 위한 OOP의 핵심 기능입니다.
- 상속의 주요 목적은 코드 재사용, 인터페이스의 일관성, 다형성(동적 함수 바인딩) 구현입니다.
- 접근 지정자는 public, protected, private 세 가지가 있으며, 각각 접근 가능한 범위가 다릅니다.
- 상속 방식에는 public, protected, private 상속이 있으며, 상속 방식에 따라 부모 클래스의 접근 권한이 자식 클래스에서 달라집니다.
- 부모 클래스의 private 멤버는 어떤 상속 방식에서도 자식 클래스가 직접 접근할 수 없습니다.
- 다음 단계에서는 상속 관계에서 생성자(Constructor)와 소멸자(Destructor)가 어떤 순서로 호출되는지를 학습하게 됩니다.
'Fundamental of CS > : : C++' 카테고리의 다른 글
| [Inheritance] Virtual Table (0) | 2024.07.16 |
|---|---|
| [Inheritance] Virtual Function (0) | 2024.07.16 |
| [Inheritance] C++ Inheritance (0) | 2024.07.16 |
| [OOP] DOP (Data-Oriented Programming) (0) | 2024.07.16 |
| [OOP] Class Keywords (0) | 2024.07.16 |