안녕하세요. 언제나 휴일, 언휴예요.
이번에는 같은 이름을 중복 정의할 수 있게 하는 함수 중복 정의(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;
}
'언어 자료구조 알고리즘 > 디딤돌 C++' 카테고리의 다른 글
11. 논리 형식 bool 제공 (0) | 2016.01.27 |
---|---|
10. 신뢰성 강화 (열거형) (0) | 2016.01.27 |
9. 레퍼런스 변수 (0) | 2016.01.27 |
8. 이름 충돌을 방지하는 namespace (0) | 2016.01.27 |
7. 매개 변수 이름이 없는 스텁 매개 변수 (2) | 2016.01.27 |
6. 디폴트 매개 변수 (0) | 2016.01.27 |
4. 태그 명을 형식 명으로 사용 (0) | 2016.01.27 |
3. 입출력 개요 (cin, cout) (0) | 2016.01.27 |
2. C++ 언어 소개 및 책의 기술 범위 (0) | 2016.01.27 |
1. 들어가기에 앞서 (2) | 2016.01.27 |