다형성

김민수·2025년 1월 8일

C++

목록 보기
15/68

"하나의 인터페이스가 여러 형태로 동작하는 것"을 의미한다.

  • 다형성은 크게 두 가지로 나뉜다
    1. 정적 다형성 (Static Polymorphism)
    2. 동적 다형성 (Dynamic Polymorphism)


1. 정적 다형성 (Static Polymorphism)

  • 정적 다형성은 컴파일 시점에 결정된다. 대표적으로 함수 오버로딩템플릿이 이에 해당한다.

⦁ 함수 오버로딩

  • 같은 이름의 함수가 다른 매개변수를 받을 때 각각 다르게 동작한다.
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!


2. 동적 다형성 (Dynamic Polymorphism)

  • 동적 다형성은 실행 시점에 결정된다.
  • 상속가상 함수(virtual functions)를 통해 구현된다.

⦁ 상속과 가상 함수

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;
}

출력:

멍멍!
야옹~


3. 차이점

구분정적 다형성동적 다형성
결정 시점컴파일 시점실행 시점
구현 방식함수 오버로딩, 템플릿상속, 가상 함수
속도빠름 (컴파일 시점에 결정)상대적으로 느림 (vtable 활용)
유연성제한적 (정해진 타입, 구조)더 유연 (실행 시 다양한 객체 활용 가능)
profile
안녕하세요

0개의 댓글