C 언어 프로그램은 같은 이름을 갖는 함수를 정의할 수 없으나 C++에서는 가능하다. 이렇게 같은 이름을 갖는 함수들을 작성하는 것을 함수 중복(overloading)이라고 하며 전역 함수와 클래스의  멤버 함수 모두에 가능하다.


 예를 들면 다음과 같다.

void print();
void print(int ia);
void print(char *str);
void print(int ia, bool bNewLine);

이 예제들의 세 개의 print()함수는 모두 같은 이름을 갖지만 입력 인자가 서로 다르므로 모두 다른 함수들이다. 이와 같이 함수의 중복이 가능하려면 각각을 구별해야 하므로 다음의 조건들을 만족해야 한다.

       ❶ 중복되는 함수들의 입력 인자의 개수가 다르거나 타입이 달라야 한다.

       ❷ 반환형만 다르고 입력 인자가 같은 중복은 허용되지 않는다.

따라서 다음의 두 함수는 함수 중복의 요건이 안 되기 때문에 오류를 발생한다.

void print(string stra);
int print(string stra);

 함수 중복을 이용하면 같은 종류의 일을 하는 서로 다른 입력 인자를 갖는 함수들을 같은 이름으로 일관성 있게 관리할 수 있으므로 무척 효율적이다. 또한 컴파일러는 함수가 호출될 때 대응되는 함수를 프로그램이 실행될 때가 아니라 컴파일할 때 결정하므로 함수 중복으로 인해서 실행 시간이 지연되는 않는다.


 다음 예를 실행해 보자.


#include "stdio.h"

void print();
void print(char *);

int main(void)
{
print(); //❶을 호출
print("Jang-Hyun Park");//❷를 호출
}

void print() //
{
printf("Hello.\n");
}

void print(char *name) //
{
print(); //❶ 을 호출
printf("My name is %s.\n", name);
}


Hello.
Hello.
My name is Jang-Hyun Park.


함수 ❷ 내부에서도 함수 ❶을 호출할 수 있음을 유의해서 보자. 사실 두 함수는 이름만 같을 뿐 내부적으로는 완전히 다른 함수로 취급되므로 이러한 상호 호출이 가능하다.



Posted by 살레시오
,