C언어에서는 같은 이름을 갖는 함수를 정의할 수가 없죠. 하지만 C++언어에서는 같은 이름을 갖는 함수를 정의할 수 있어요. 이와 같은 문법을 함수 중복 정의 (Function Overloading)라고 불러요.
C++에서는 개발자가 정의한 코드를 컴파일 과정에서도 전개합니다. 함수 중복 정의가 대표적인 컴파일 과정에 전개하는 문법이예요. C++컴파일러는 개발자가 정의한 함수 명을 입력 매개 변수 리스트에 따라 유일한 이름의 함수 명으로 결정하는 함수 코드화(부호화) 과정이 있어요. 이러한 컴파일 전개가 있어서 같은 이름의 함수를 정할 수 있어요.
예를 들어 두 개의 정수 중에 최대값을 찾는 함수 명이 GetMax라고 정의했을 때 두 개의 문자 중에 최대값을 찾는 함수 명도 GetMax로 정할 수 있어요.
int GetMax(int a,int b) { cout<<"int GetMax(int a,int b)"<<endl; if(a>b) { return a; } return b; } char GetMax(char a,char b) { cout<<"char GetMax(char a,char b)"<<endl; if(a>b) { return a; } return b; }
그리고 호출하는 곳에서 GetMax(2,3); 처럼 호출하면 두 개의 정수를 입력 인자로 받는 함수를 호출하고 GetMax(‘a’,’b’); 처럼 호출하면 두 개의 문자를 입력 인자로 받는 함수를 호출해 줍니다.
//함수 중복 정의 //Program.cpp #include <iostream> using namespace std; int GetMax(int a,int b) { cout<<"int GetMax(int a,int b)"<<endl; //테스트를 위한 출력 if(a>b) { return a; } return b; } char GetMax(char a,char b) { cout<<"char GetMax(char a,char b)"<<endl; //테스트를 위한 출력 if(a>b) { return a; } return b; } int main() { cout<<GetMax(2,3)<<endl; //int GetMax(int a, int b);를 호출 cout<<GetMax('a','b')<<endl; //char GetMax(char a,char b);를 호출 return 0; }
▷ 실행 결과
int GetMax(int a,int b) 3 char GetMax(char a, char b) b
물론 아무 조건없이 함수 중복 정의가 가능한 것은 아니예요. 최소한 입력 매개 변수 리스트가 달라야 함수 중복 정의를 할 수 있어요. 반환 형식만 다르게 함수를 중복 정의할 수 없어요.
다음은 반환 형식만 달라서 함수 중복 정의를 하지 못하는 코드예요.
//함수 중복 정의 실패 //Program.cpp #include <iostream> using namespace std; void Foo() { cout<<"void Foo()"<<endl; } int Foo() //앞에 Foo 함수와 반환 형식만 달라서 함수 중복 정의할 수 없음 { cout<<"int Foo()"<<endl; return 0; } int main() { Foo(); return 0; }
그리고 컴파일러가 호출하는 곳에서 어느 함수를 호출한 것인지 판단할 수 없을 수 있으니 주의해서 사용하세요. 만약 long 형식의 입력 매개 변수 두 개를 받는 함수와 short 형식의 입력 매개 변수 두 개를 받는 함수를 중복 정의하였을 때 int 형식을 인자로 전달하면 컴파일러는 어느 함수를 호출하는지 판단할 수 없어요.
C++ 컴파일러는 이럴 때 컴파일 오류 메시지로 “호출이 모호합니다.”라는 메시지를 출력합니다.
다음은 함수 중복 정의는 가능하지만 호출하는 곳에서 모호하게 호출한 코드입니다. 이 코드는 컴파일 오류가 발생합니다.
//함수 중복 정의하였지만 호출이 모호한 예 #include <iostream> using namespace std; long Add(long a,long b) { return a+b; } short Add(short a,short b) { return a+b; } int main() { Add(2,3);// 어느 함수를 호출한 것인지 모호함 - 컴파일 오류 return 0; }