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

C++ 다형성 개념과 다형성 구현 (팩토리 클래스, 오버라이딩)

by Sein_ 2025. 10. 14.
728x90

[Do it C++ 완전정복_ 243~250p]

다형성 (Polymorphism)

상속받은 클래스들이 부모와 다른 다양한 특성을 가지는 것을 말한다.

 

  • 같은 이름의 함수를 여러 클래스에서 다르게 구현할 수 있다. (오버라이딩)
  • 부모 클래스의 포인터나 참조로 자식 객체를 제어할 수 있다.
  • 실행 시점(런타임)에 실제 객체의 타입에 따라 호출되는 함수가 결정된다.

 

→ 주로 상속과 가상함수(virtual function) 를 통해 구현된다.

 

다형성 구현 예시

같은 'sound()' 함수 호출이지만, 실제 객체 타입에 따라 다르게 동작한다.

class Animal {
public:
    virtual void sound() { cout << "동물의 소리" << endl; }
};

class Dog : public Animal {
public:
    void sound() override { cout << "멍멍!" << endl; }
};

class Cat : public Animal {
public:
    void sound() override { cout << "야옹!" << endl; }
};

int main() {
    Animal* a1 = new Dog();
    Animal* a2 = new Cat();

    a1->sound();  // 멍멍!
    a2->sound();  // 야옹!
}

 

다형성 구현

(1) 팩토리 클래스를 통한 객체 생성 분리

다형성을 활용하면 객체를 직접 new로 만들지 않고, 팩토리 클래스가 대신 생성해서 반환하도록 설계할 수 있다.

새로운 클래스가 추가되어도 기존 코드 수정 없이 확장 가능하다.

// 팩토리 클래스 추가
class AnimalFactory {
public:
    static Animal* createAnimal(string type) {
        if (type == "dog") return new Dog();
        if (type == "cat") return new Cat();
        return nullptr;
    }
};

int main() {
    Animal* animal = AnimalFactory::createAnimal("dog");
    animal->sound(); // 멍멍!
    delete animal;
}

 

 

(2) 함수 재정의 (오버라이딩_overriding)

부모 클래스의 함수를 자식 클래스에서 다시 정의하여 사용하는 것을 말한다.

가상함수를 사용하지 않으면 정적 바인딩이 되어 포인터 형식에 따라 호출이 결정된다.

class Parent {
public:
    void show() { cout << "부모 클래스 함수" << endl; }
};

class Child : public Parent {
public:
    void show() { cout << "자식 클래스 함수" << endl; } // 재정의
};

 

주의: 여기서 자식 클래스를 부모 클래스의 레퍼런스로 접근하면 부모 클래스에 정의된 함수가 호출된다.

 

 

(3) 가상함수(Virtual Function) 와 오버라이딩

함수가 virtual로 선언되어있지 않을 경우, 컴파일러는 정의 타입 클래스(부모 클래스)의 함수를 호출한다.

부모 클래스의 함수를 가상함수(virtual) 로 선언하면, 자식 클래스에서 이를 재정의했을 때 런타임에 실제 객체의 함수가 호출된다.

class Parent {
public:
    virtual void show() { cout << "부모 클래스" << endl; }
};

class Child : public Parent {
public:
    void show() override { cout << "자식 클래스" << endl; }
};

int main() {
    Parent* p = new Child();
    p->show();  // "자식 클래스" (가상함수 덕분에 런타임 결정)
}