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. |
함수 ❷ 내부에서도 함수 ❶을 호출할 수 있음을 유의해서 보자. 사실 두 함수는 이름만 같을 뿐 내부적으로는 완전히 다른 함수로 취급되므로 이러한 상호 호출이 가능하다.
댓글 없음:
댓글 쓰기