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
Posted by 바람처럼..
|