Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++ 다형성(Polymorphism) 완벽 이해 – 함수 오버로딩 예제로 배우기


다형성(Polymorphism)은 객체 지향 프로그래밍(OOP)의 핵심 특징 중 하나로, 하나의 이름이 여러 가지 형태로 동작할 수 있는 능력을 의미합니다. '여러 형태'라는 뜻을 가진 이 개념은 C++에서 크게 컴파일 타임 다형성런타임 다형성 두 가지로 나눌 수 있습니다.

C++ 다형성의 두 가지 유형

컴파일 타임 다형성은 프로그램이 컴파일되는 시점에 어떤 함수가 호출될지 결정되는 방식입니다. 대표적인 예로 함수 오버로딩(Function Overloading)연산자 오버로딩(Operator Overloading)이 있습니다.

런타임 다형성은 프로그램 실행 중에 호출될 함수가 결정되는 방식으로, 함수 오버라이딩(Function Overriding)이 대표적입니다. 이는 주로 상속과 가상 함수(virtual function)를 통해 구현됩니다.

다음은 C++에서 함수 오버로딩을 사용하여 다형성을 구현한 예제입니다.

예제 코드

#include <iostream>
using namespace std;
class Example {
   public :
   void func(int a) {
      cout << "\nThe value of a: " << a;
   }
   void func(int a, int b) {
      cout << "\nThe value of a: " << a;
      cout << "\nThe value of b: " << b;
   }
   void func(char c) {
      cout << "\nThe value of c: " << c;
   }
};
int main() {
   Example obj;
   cout<< "\nOne int value";
   obj.func(5);
   cout<< "\nOne char value";
   obj.func('A');
   cout<< "\nTwo int values";
   obj.func(7, 2);
   return 0;
}

실행 결과

위 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

One int value
The value of a: 5
One char value
The value of c: A
Two int values
The value of a: 7
The value of b: 2

코드 분석

위 프로그램의 동작 원리를 단계별로 살펴보겠습니다.

1. 함수 오버로딩 정의

Example 클래스에는 이름이 같지만 매개변수가 서로 다른 3개의 func() 함수가 정의되어 있습니다. 호출 시 전달되는 인자의 개수와 자료형에 따라 컴파일러가 적절한 함수를 자동으로 선택합니다.

class Example {
   public :
   void func(int a) {
      cout << "\nThe value of a: " << a;
   }
   void func(int a, int b) {
      cout << "\nThe value of a: " << a;
      cout << "\nThe value of b: " << b;
   }
   void func(char c) {
      cout << "\nThe value of c: " << c;
   }
};
  • func(int a) : 정수 1개를 받아 출력합니다.
  • func(int a, int b) : 정수 2개를 받아 각각 출력합니다.
  • func(char c) : 문자 1개를 받아 출력합니다.

2. main() 함수에서의 호출

main() 함수에서는 Example 클래스의 객체 obj를 생성한 후, 서로 다른 인자를 전달하며 func() 함수를 호출하여 함수 오버로딩의 동작을 확인합니다.

int main() {
   Example obj;
   cout<< "\nOne int value";
   obj.func(5);
   cout<< "\nOne char value";
   obj.func('A');
   cout<< "\nTwo int values";
   obj.func(7, 2);
   return 0;
}

obj.func(5)는 정수 1개를 전달하므로 func(int a)가 호출되고, obj.func('A')는 문자를 전달하므로 func(char c)가, obj.func(7, 2)는 정수 2개를 전달하므로 func(int a, int b)가 각각 호출됩니다. 이처럼 같은 이름의 함수가 전달된 인자에 따라 다르게 동작하는 것이 바로 컴파일 타임 다형성의 핵심입니다.