**다형성(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;
}
Greeter 클래스는 순수 가상 함수 greet()를 포함한 추상 클래스입니다. 이를 상속받은 클래스는 반드시 자신만의 greet() 메서드를 구현해야 합니다.Dog와 Cat 클래스는 각각 greet()를 오버라이드하여, "멍멍!"과 "야옹!"을 출력합니다.Person 클래스는 생성자로 국적 정보를 받아, 국적에 따라 서로 다른 인사말을 출력합니다.