1. 함수 오버로딩(Function Overloading)

함수 오버로딩(Function Overloading)이란, 함수명은 같으며 인자의 자료형이나 수가 다른 함수의 선언을 허용하는 것을 말합니다. C에서는 함수 오버로딩을 허용하지 않았지만, C++에서는 아래와 같이 두 함수의 이름이 같아도 컴파일러가 오류를 발생시키지 않습니다.

#include <iostream>

using namespace std;

void func(int a)
{
	cout << "void func(int a)이 호출됨!" << endl; 
}

void func(int a, int b)
{
	cout << "void func(int a, int b)이 호출됨!" << endl;
}

int main()
{
	func(4);
	func(5, 6);

	return 0;
}

결과:

void func(int a)이 호출됨!

void func(int a, int b)이 호출됨!

계속하려면 아무 키나 누르십시오 . . .

바로 전 강좌인 '3편. 네임스페이스'에서 using 지시자를 배웠었죠? 한번 3행을 보시면, std라는 네임스페이스를 사용하겠다는 말이 됩니다. 이제 더는 귀찮게 std::를 일일이 붙여주지 않아도, 그대로 사용할 수 있습니다. 이번 강좌부터는, 편의를 위해 using namespace std;를 포함시킬 생각입니다.


코드로 돌아가, 5행을 먼저 살펴보도록 합시다. 여기서 주목하셔야 할 부분은 매개변수 부분입니다. 정수형 변수 a가 매개변수로 와있습니다. 그리고 10행을 보시면 이번에는 정수형 변수 a, b가 매개변수로 와있습니다. 5행과 10행에서 똑같은 함수명으로 함수가 정의되었으나, 매개변수의 수는 다릅니다. 결과를 살펴보시면 넘겨주는 인자의 수에 따라 출력되는 결과가 다른 것을 확인할 수 있습니다.


17행을 살펴보면, 인자로 4를 넘겨주었는데 이 경우에는 위에 정의된 함수 중 매개변수가 한 개인 함수를 호출합니다. 두 개를 넘겨주면 매개변수가 두 개인 함수를 호출하죠. 물론 세 개를 넘겨주면 인수 목록과 일치하는 오버로드된 함수가 없어 컴파일러에서 오류를 내보냅니다.


함수 오버로딩의 특징을 정리하자면 아래와 같습니다.

(1) 함수명이 같아야 한다.

(2) 매개변수의 수가 다르거나, 아니면 그 매개변수의 수가 같고 자료형이 달라야만 한다.

(3) 위의 두 조건을 모두 만족하면 반환형의 차이는 함수 오버로딩에 영향을 미치지 않는다.

예를 들면 아래와 같습니다. 참고로, 아래에서 double add(int a, int b) { ... } 꼴의 함수를 추가시키면 오류가 발생합니다. 1행의 코드와 비교했을 때, 매개변수의 수나 자료형은 모두 같고 반환형만 다르기 때문입니다.

int add(int a, int b) { ... } // add(3, 4);
int add(double a, double b) { ... } // add(1.2, 3.4);
float add(float a, float b) { ... } // add(3.4f, 5.6f);
int add(int a, int b, int c) { ... } // add(1, 2, 3);

함수 오버로딩에 관한 강좌는 여기서 그만 마치도록 하겠습니다. 수고하셨습니다.


다음 강좌에서는 new, delete에 대해 알아보도록 하겠습니다.