**다형성(Polymorphism)**은 객체 지향 프로그래밍에서 **한 인터페이스(혹은 메서드)**를 통해 여러 다른 형태의 객체들이 자신만의 방식으로 동작할 수 있도록 하는 기능입니다.

쉽게 설명하자면:

비유를 들어 설명하면:


다형성은 코드의 유연성과 확장성을 높여, 공통된 인터페이스를 사용해 다양한 객체를 일관되게 처리할 수 있게 해 줍니다. 이를 통해 프로그램이 더 간결하고 유지보수가 쉬워집니다.

이정도면 지금 단계에선 충분합니다.

다형성에 대해 더 알아보고 싶은 독자께서는 아래 글을 참고하시기 바랍니다 :)

자 더 알아볼까요?

다음은 C++로 다형성을 활용하여 "인사하기" 인터페이스를 구현한 예시 코드입니다.

이 예제에서는 동물 클래스사람 클래스가 동일한 인터페이스(가상 함수 greet())를 사용해 각각 고유의 방식으로 인사하는 모습을 보여줍니다.

#include <iostream>
#include <string>

// "인사하기" 인터페이스를 나타내는 추상 클래스
class Greeter {
public:
    // 순수 가상 함수: 각 클래스에서 반드시 구현해야 합니다.
    virtual void greet() const = 0;
    virtual ~Greeter() {} // 가상 소멸자
};

// 동물 클래스: 예를 들어, 개와 고양이가 서로 다른 방식으로 인사합니다.
class Dog : public Greeter {
public:
    void greet() const override {
        std::cout << "멍멍!" << std::endl;
    }
};

class Cat : public Greeter {
public:
    void greet() const override {
        std::cout << "야옹!" << std::endl;
    }
};

// 사람 클래스: 국적에 따라 인사말이 다르게 표현됩니다.
class Person : public Greeter {
private:
    std::string nationality; // 국적 정보를 저장
public:
    Person(const std::string& nat) : nationality(nat) {}

    void greet() const override {
        if (nationality == "Korea")
            std::cout << "안녕하세요!" << std::endl;
        else if (nationality == "USA")
            std::cout << "Hello!" << std::endl;
        else if (nationality == "France")
            std::cout << "Bonjour!" << std::endl;
        else
            std::cout << "Hi!" << std::endl;
    }
};

int main() {
    // 동일한 인터페이스를 사용해 다양한 객체를 생성합니다.
    Greeter* animal1 = new Dog();
    Greeter* animal2 = new Cat();
    Greeter* person1 = new Person("Korea");
    Greeter* person2 = new Person("USA");
    Greeter* person3 = new Person("France");
    Greeter* person4 = new Person("Japan"); // 예외 케이스: 기본 "Hi!" 출력

    // 다형성: 각 객체가 자신만의 방식으로 인사합니다.
    animal1->greet();  // 출력: 멍멍!
    animal2->greet();  // 출력: 야옹!
    person1->greet();  // 출력: 안녕하세요!
    person2->greet();  // 출력: Hello!
    person3->greet();  // 출력: Bonjour!
    person4->greet();  // 출력: Hi!

    // 할당한 메모리 해제
    delete animal1;
    delete animal2;
    delete person1;
    delete person2;
    delete person3;
    delete person4;

    return 0;
}

설명