티스토리 뷰

반응형

✅ 다형성이란?

👉 정의부터

**다형성(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 함수를 이용해 실행 시간에 실제 객체의 함수를 호출하게 만드는 구조입니다.


 

반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함
반응형