Fundamental of CS/: : C++

[Inheritance] C++ 상속(Inheritance) Intro

Jay.P Morgan 2024. 7. 16. 11:02

 

 

상속(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