[디딤돌 C++] 5. 함수 중복 정의 (FUNCTION OVERLOADING)

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