"하나의 인터페이스가 여러 형태로 동작하는 것"을 의미한다.
void print(int value) {
std::cout << "정수 출력: " << value << "\n";
}
void print(double value) {
std::cout << "실수 출력: " << value << "\n";
}
void print(const std::string& value) {
std::cout << "문자열 출력: " << value << "\n";
}
int main() {
print(10); // 정수 출력
print(3.14); // 실수 출력
print("Hello!"); // 문자열 출력
return 0;
}
출력:
정수 출력: 10
실수 출력: 3.14
문자열 출력: Hello!
템플릿을 사용하면 코드 재사용성을 높이고, 다양한 타입을 처리할 수 있다.
template <typename T>
void print(T value) {
std::cout << "값: " << value << "\n";
}
int main() {
print(10); // int
print(3.14); // double
print("Hello!"); // const char*
return 0;
}
출력:
10
3.14
Hello!
class Animal {
public:
virtual void sound() { // 가상 함수
std::cout << "동물이 소리를 낸다.\n";
}
};
class Dog : public Animal {
public:
void sound() override { // 함수 재정의
std::cout << "멍멍!\n";
}
};
class Cat : public Animal {
public:
void sound() override {
std::cout << "야옹~\n";
}
};
int main() {
Animal* animal1 = new Dog();
Animal* animal2 = new Cat();
animal1->sound(); // 멍멍!
animal2->sound(); // 야옹~
delete animal1;
delete animal2;
return 0;
}
출력:
멍멍!
야옹~
| 구분 | 정적 다형성 | 동적 다형성 |
|---|---|---|
| 결정 시점 | 컴파일 시점 | 실행 시점 |
| 구현 방식 | 함수 오버로딩, 템플릿 | 상속, 가상 함수 |
| 속도 | 빠름 (컴파일 시점에 결정) | 상대적으로 느림 (vtable 활용) |
| 유연성 | 제한적 (정해진 타입, 구조) | 더 유연 (실행 시 다양한 객체 활용 가능) |