1] 함수 오버로딩의 이해
확장자가 .c로 끝나는 C 언어로 작성된 프로그램에서는 다음과 같은 함수의
정의가 허용되지 않았다.
int function(void)
{
return 0;
}
int function(int a, int b)
{
return a+b;
}
위의 소스는 함수의 이름이 같기 때문에 컴파일 타임에 오류를 발생시킨다. 아
니 c 에서는 오류를 발생 시켰다. 하지만 C++로 넘어오면서 부터 달라졌다. c++
은 호출하고자 하는 함수를 찾을 떄 함수의 이름뿐 아니라 매개 변수의 정보까
지도 동시에 참조한다. 따라서 c++은 이름이 같고 매개 변수의 타입 혹은 개수
가 다른 함수들의 정의를 허용한다. 그리고 이를 가리켜 함수 오버로딩
(function overloading) 이라 한다.
2] 함수 오버로딩의 조건
c++은 함수의 이름이 같아도 매개 변수의 타입 및 개수가 다르면 문제되지 않으
며, 이를 가리켜 " 함수가 오버로딩 되었다. " 라고 표현한다고 하였다. 다음은
대표적인 함수 오버로딩의 예이다.
int function1(int n){.....}
int function2(char c) {.......}
위의 두 함수도 오버로딩 되었다. 함수의 이름이 같지만 매개 변수의 자료형이
다르기 때문이다.
int function(int v){.....}
int function(int v1, int v2){.......}
위의 두 함수도 오버로딩 되었다. 함수의 이름과 매개 변수의 자료형은 같지만
자료형의 개수가 다르기 때문이다.
즉, 함수 오버로딩의 기본 조건은 다음과 같다.
"함수의 이름은 같지만 매개 변수의 타입이나 개수가 달라야 한다. "
그 이외에도 함수가 오버로딩 되기 위한 조건이 하나 더 있는데 이에 대해서는
다음 기회에 언급하겠다.
3] 오해하기 쉬운 함수 오버로딩
함수 오버로딩을 처음 접하게 되면 두 개의 함수를 눈으로만 보고 잘못 판단하
는 경우가 종종있다. 예를 하나 들어 보겠다. 다음의 함수들은 오버로딩 조건을
충족하는가, 아니면 충족하지 못하고 컴파일 시 오류를 발생시키겠는가? 눈 여
겨 볼 부분은 함수의 리턴 타입이다.
#include <iostream>
void function(void)
{
std::cout << "function(void call " << std::endl;
}
int function(void)
{
std::cout << "function(char c) call " << std::endl;
return 1;
}
int main(void)
{
function();
return 0;
}
물론 위에 정의되어 있는 두 개의 function 함수는 이름은 같지만, 리턴 타입이
다르다. 그러나 리턴 타입만 가지고는 함수가 오버로딩되었다고 말할 수 없다.
결국 컴파일러는 " 난 네가 뭘 원하는지 몰라 (Ambiguous) " 라는 메시지를 출
력하게 된다. 즉, 리턴 타입만 달라서는 함수가 오버로딩되지 않는다.
'프로그래밍 > C,C++' 카테고리의 다른 글
[C,C++] memset, memcpy 함수 사용법! (6) | 2011.10.11 |
---|---|
[C,C++] 더블버퍼링.. (0) | 2011.10.05 |
[C,C++] 디폴트(DeFault) 매개 변수 (0) | 2011.09.14 |
[C,C++] 이름공간(namespace) (0) | 2011.09.14 |
[C,C++] 인-라인(in-line) 함수 (0) | 2011.09.14 |