[c++] 함수 오버로딩과 동적 다형성

C++는 함수 오버로딩과 동적 다형성의 기능을 제공하여 강력한 프로그래밍 언어로써 다양한 상황에 유연하게 대응할 수 있습니다. 이번 글에서는 이 두 가지의 기능에 대해 자세히 살펴보겠습니다.

함수 오버로딩

함수 오버로딩은 한 클래스 내에서 함수 이름은 동일하지만 매개변수의 수나 타입이 다른 여러 개의 함수를 정의하는 것을 말합니다. 이를 통해 동일한 이름의 함수를 여러 번 정의할 수 있으며, 컴파일러가 매개변수에 따라 올바른 함수를 호출합니다.

아래는 함수 오버로딩의 예시입니다:

#include <iostream>

class OverloadExample {
public:
    void print(int num) {
        std::cout << "Integer number: " << num << std::endl;
    }

    void print(double num) {
        std::cout << "Double number: " << num << std::endl;
    }
};

int main() {
    OverloadExample obj;
    obj.print(5);
    obj.print(5.5);
    return 0;
}

위 예제에서 print 함수는 정수와 실수를 각각 출력하는 두 가지 오버로딩된 형태를 가지고 있습니다.

동적 다형성

동적 다형성은 상속 관계에 있는 클래스들 사이에서 부모 클래스의 포인터를 이용하여 자식 클래스의 메소드를 호출하는 기능을 말합니다. 이를 통해 미리 예측할 수 없는 상황에서도 적절한 메소드가 호출되어 유연한 프로그래밍이 가능합니다.

아래는 동적 다형성의 예시입니다:

#include <iostream>

class Shape {
public:
    virtual void draw() {
        std::cout << "Shape::draw()" << std::endl;
    }
};

class Circle : public Shape {
public:
    void draw() override {
        std::cout << "Circle::draw()" << std::endl;
    }
};

int main() {
    Shape* shape1 = new Shape();
    Shape* shape2 = new Circle();

    shape1->draw();  // Shape::draw()
    shape2->draw();  // Circle::draw()

    delete shape1;
    delete shape2;
    return 0;
}

위 예제에서 Shape 클래스와 Circle 클래스는 상속 관계에 있고, draw 메소드가 동적으로 호출됩니다.

함수 오버로딩과 동적 다형성은 C++에서 다형성을 구현하는 강력한 기능으로, 유연하고 효율적인 프로그래밍을 가능하게 합니다. 이러한 기능을 적재적소에 활용하여 보다 효율적이고 유연한 코드를 작성할 수 있습니다.

참고 자료