본문 바로가기
C++/C++ 문법

C++ 다중 상속의 단점과 보완(컴포지션, 어그리게이션)

by Sein_ 2025. 10. 14.
728x90

[Do it C++ 완전정복_ 301~310p]

다중 상속의 단점

다중 상속

  • 하나의 클래스가 두 개 이상의 부모 클래스로부터 상속받는 것
class A { };
class B { };
class C : public A, public B { }; // 다중 상속

 

다중 상속의 단점 

  • 모호성: 여러 부모 클래스에 동일한 이름의 멤버가 존재할 경우, 어떤 부모의 멤버를 사용해야 하는지 모호함
  • 다이아몬드 상속 : 공통 부모를 중복 상속할 때, 상위 클래스의 멤버가 중복 복사되어 두 번 존재하는 문제 발생

→ 대안으로 컴포지션과 어그리게이션을 사용한다.

 

다중 상속 단점 보완

컴포지션 (Composition)

클래스가 다른 클래스를 멤버 변수로 포함(Has-A 관계) 하여 기능을 확장하거나 재사용하는 방식

 

  • 클래스 안에 다른 객체를 멤버로 ‘포함’하는 방식으로 재사용을 구현 
  • 생명주기 공유 → Car가 사라지면 Engine도 함께 소멸됨 (강한 결합 관계)

 

class Engine {
public:
    void start() { cout << "엔진 가동\n"; }
};

class Car {
private:
    Engine engine; // 포함 관계 (Composition)
public:
    void run() {
        engine.start(); // Engine 기능 사용
        cout << "자동차 주행\n";
    }
};

 

어그리게이션 (Aggregation)

 

컴포지션과 유사하지만, 포함된 객체가 독립적인 생명주기를 가진다는 점이 다르다.

  • Car는 Engine을 가지고 있지만 Engine은 Car와 별도로 존재 가능
  • 객체 간 연결 관계에 가깝다. (약한 결합 관계)
class Engine {
public:
    void start() { cout << "엔진 시동\n"; }
};

class Car {
private:
    Engine* engine; // 포인터 사용 (외부에서 주입)
public:
    Car(Engine* e) : engine(e) {}
    void run() { engine->start(); cout << "차량 주행\n"; }
};

int main() {
    Engine e;
    Car c(&e);  // 외부에서 전달받음
    c.run();
}