[c++] 가상 함수와 다형성의 개념 비교

이번 포스트에서는 C++에서 가상 함수와 다형성의 개념을 비교하고, 각각의 역할과 사용 방법을 알아보겠습니다.

가상 함수 (Virtual Functions)

가상 함수란 기본 클래스에서 파생된 클래스에서 재정의(override)될 수 있는 함수를 의미합니다. 이를 통해 파생 클래스에서 동일한 이름의 함수를 재정의하면, 해당 객체가 원래의 기본 클래스의 타입으로 선언되었더라도 그 함수가 호출됩니다.

가상 함수는 기본 클래스에서 virtual 키워드로 선언되며, 파생 클래스에서는 동일한 시그니처와 virtual 키워드로 재정의됩니다.

가상 함수를 선언하여 다형성을 구현하는 것은 객체 지향 프로그래밍에서 상속과 연동되어 객체의 동작을 유연하게 만들어 줍니다.

예시 코드:

class Base {
public:
    virtual void show() {
        cout << "Base class" << endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        cout << "Derived class" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;

    basePtr = &derivedObj;
    basePtr->show(); // "Derived class" 출력
}

다형성 (Polymorphism)

다형성은 객체 지향 프로그래밍에서 하나의 인터페이스를 통해 여러 구현체를 사용할 수 있는 기능을 말합니다. 이를 통해 프로그램은 동일한 메소드 호출로 다양한 객체들에 대한 작업을 수행할 수 있습니다.

가상 함수를 통해 파생 클래스의 다형성을 지원하여, 동일한 메서드 호출에 대해 다른 동작을 나타내도록 할 수 있습니다.

예시 코드:

class Animal {
public:
    virtual void speak() {
        cout << "Animal speaks" << endl;
    }
};

class Dog : public Animal {
public:
    void speak() override {
        cout << "Dog barks" << endl;
    }
};

class Cat : public Animal {
public:
    void speak() override {
        cout << "Cat meows" << endl;
    }
};

void makeSpeak(Animal* animal) {
    animal->speak();
}

int main() {
    Dog dog;
    Cat cat;

    makeSpeak(&dog); // "Dog barks" 출력
    makeSpeak(&cat); // "Cat meows" 출력
}

결론

가상 함수와 다형성은 C++에서 객체 지향 프로그래밍을 더 유연하게 만들어주는 핵심적인 요소입니다. 상속과 함께 사용하여 클래스의 확장성을 높이고, 동일한 인터페이스를 통해 다양한 동작을 구현할 수 있도록 도와줍니다.

이렇듯, 가상 함수와 다형성을 잘 활용하면 중복성을 줄이고 유지보수성을 높일 수 있으며, 코드의 가독성과 재사용성을 높일 수 있습니다.

참고 자료:

이상으로 가상 함수와 다형성의 개념을 비교하는 내용을 마치도록 하겠습니다. 감사합니다!