C++에서는 같은 스코프(범위) 내에서 동일한 함수 이름으로 여러 개의 정의를 가질 수 있습니다. 이것이 바로 함수 오버로딩(Function Overloading)입니다. 다만 각 함수 정의는 매개변수 목록의 인자 타입 또는 인자의 개수가 서로 달라야 한다는 조건이 있습니다.
반환 타입만으로는 오버로딩할 수 없다
주의해야 할 점은, 반환 타입(return type)만 다른 함수 선언은 오버로딩할 수 없다는 것입니다. 컴파일러가 함수를 구분하는 기준은 함수 시그니처(signature), 즉 함수 이름과 매개변수 목록이기 때문입니다.
함수 오버로딩은 본질적으로 컴파일 타임 다형성(compile-time polymorphism)에 해당합니다. 컴파일러는 호출 시점에 함수 시그니처를 검사하여 어떤 함수를 실행할지 결정합니다. 따라서 시그니처가 서로 다르면 오버로딩이 가능하지만, 반환 타입은 함수 오버로딩에 아무런 영향을 주지 않습니다. 동일한 함수 시그니처에 반환 타입만 다르게 정의하면 컴파일 에러가 발생합니다.
예제 코드: 하나의 print() 함수로 여러 데이터 타입 출력하기
아래 예제는 동일한 이름의 print() 함수를 사용하여 서로 다른 데이터 타입(int, double, char*)을 출력하는 방법을 보여줍니다.
#include <iostream>
using namespace std;
class printData {
public:
void print(int i) {
cout << "Printing int: " << i << endl;
}
void print(double f) {
cout << "Printing float: " << f << endl;
}
void print(char* c) {
cout << "Printing character: " << c << endl;
}
};
int main(void) {
printData pd;
pd.print(5); // 정수를 출력하는 print 호출
pd.print(500.263); // 실수(float)를 출력하는 print 호출
pd.print("Hello C++"); // 문자열을 출력하는 print 호출
return 0;
}실행 결과
Printing int: 5 Printing float: 500.263 Printing character: Hello C++
핵심 요약
- 같은 이름의 함수라도 매개변수의 타입이나 개수가 다르면 오버로딩 가능
- 반환 타입만 다른 경우에는 오버로딩 불가 (컴파일 에러 발생)
- 함수 오버로딩은 컴파일 타임 다형성의 대표적인 예시