티스토리 뷰
반응형
✅ 다형성이란?
👉 정의부터
**다형성(polymorphism)**은 **“하나의 이름이 다양한 형태로 동작할 수 있는 것”**을 뜻합니다.
C++에서는
- 같은 함수 이름이라도 다른 방식으로 동작할 수 있도록 만들 수 있고
- 같은 부모 타입을 가진 자식 객체들이 서로 다르게 행동하게 만들 수 있습니다.
🧠 왜 쓰는 걸까?
공통된 인터페이스로 다양한 객체를 다룰 수 있게 해 줍니다.
예를 들어:
Animal* a = new Dog();
a->speak(); // 강아지가 멍멍!
Animal* b = new Cat();
b->speak(); // 고양이가 야옹!
→ 둘 다 Animal*인데 동작은 다름. 이게 바로 다형성입니다.
✅ 다형성의 종류
C++에서는 두 가지로 나뉩니다.
종류 이름 타이밍 키워드 예시
정적 다형성 | Static Polymorphism | 컴파일 시점 | 함수 오버로딩, 템플릿 | print(int), print(double) |
동적 다형성 | Dynamic Polymorphism | 실행 시점 | virtual, 상속 | a->speak() → |
✅ 예시로 쉽게 이해하기
📌 1. 정적 다형성 (Static Polymorphism)
함수 오버로딩
void print(int x) { std::cout << "정수: " << x << std::endl; }
void print(std::string s) { std::cout << "문자열: " << s << std::endl; }
print(10); // "정수: 10"
print("Hello"); // "문자열: Hello"
→ 같은 이름 print지만 타입에 따라 다르게 동작합니다.
→ 컴파일 시점에 정해집니다.
📌 2. 동적 다형성 (Dynamic Polymorphism)
가상 함수 + 상속
class Animal {
public:
virtual void speak() {
std::cout << "동물이 말함\n";
}
};
class Dog : public Animal {
public:
void speak() override {
std::cout << "멍멍!\n";
}
};
class Cat : public Animal {
public:
void speak() override {
std::cout << "야옹!\n";
}
};
Animal* a1 = new Dog();
Animal* a2 = new Cat();
a1->speak(); // "멍멍!"
a2->speak(); // "야옹!"
여기서 핵심은 Animal*이라는 부모 타입의 포인터를 통해
자식 클래스인 Dog, Cat의 동작을 동적으로 선택하게 만든다는 점입니다.
✅ 핵심 키워드 요약
키워드 역할
virtual | 부모 클래스 함수에 붙여서 동적 다형성 허용 |
override | 자식 클래스에서 재정의할 때 사용 (실수 방지용) |
포인터/참조 | 동적 다형성은 반드시 포인터나 참조로 접근해야 작동 |
✅ 동적 다형성에서 virtual이 없으면?
class Animal {
public:
void speak() { std::cout << "동물\n"; }
};
class Dog : public Animal {
public:
void speak() { std::cout << "멍멍\n"; }
};
Animal* a = new Dog();
a->speak(); // "동물" ← 부모 함수 호출됨
→ virtual이 없으면 자식 객체여도 부모 함수가 호출됨
→ 즉, 다형성이 깨짐
✅ 다형성의 장점
- 코드 유연성 증가: 다양한 객체를 같은 방식으로 처리
- 유지보수 편리: 새로운 자식 클래스 추가해도 기존 코드 변경 거의 없음
- 추상화 가능: 인터페이스 기반 설계에 적합
✅ 한 문장 요약
C++에서 **다형성(polymorphism)**은 같은 이름의 함수가 객체의 타입에 따라 다르게 동작하도록 하는 것이며,
특히 동적 다형성은 virtual 함수를 이용해 실행 시간에 실제 객체의 함수를 호출하게 만드는 구조입니다.
반응형
'프로그래밍 > 홍정모의 따라배우는 C++' 카테고리의 다른 글
포인터의 타입은 왜 있는가? (0) | 2025.04.27 |
---|---|
C++에서 final 키워드란 무엇인가? (0) | 2025.04.27 |
오버로딩과(overloading) 오버라이딩(overriding)의 차이 (0) | 2025.04.04 |
가상 함수(virtual function) (0) | 2025.04.04 |
클래스에서 멤버변수 접근 ( . 과 ->의 차이점) (0) | 2025.04.04 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 오블완
- 윤성우
- c++
- 뇌와행동의기초
- 정보처리기사
- 백준
- stl
- 사회심리학
- 일본어
- Python
- 열혈프로그래밍
- 심리학
- C/C++
- 일문따
- 데이터분석
- C
- 파이썬
- 보세사
- 강화학습
- 류근관
- 통계학
- 회계
- 코딩테스트
- 인프런
- 통계
- 일본어문법무작정따라하기
- K-MOOC
- 인지부조화
- 티스토리챌린지
- 여인권
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
반응형