오버로딩이란?
C++은 C와 다르게 함수 다중 정의를 지원한다. 함수의 이름이 같더라도 매개변수가 달라지면 다른 함수가 된다.
#include <iostream>
using namespace std;
int Add(int num1, int num2, int num3)
{
return num1 + num2 + num3;
}
int Add(int num1, int num2)
{
return num1 + num2;
}
double Add(double num1, double num2)
{
return num1 + num2;
}
int main()
{
cout << Add(10, 20) << endl;
cout << Add(10, 20, 30) << endl;
cout << Add(1.1, 2.2) << endl;
return 0;
}
결과값:
30
60
3.3
매개변수별로 적절한 함수가 호출되는 것을 확인 할 수 있다. 호출되는 함수가 컴파일러에 의해 자동으로 결정된다.
다음과 같은 경우는 문법에 맞지 않다.
int Add(int num1, int num2)
{
return num1 + num2;
}
double Add(int num1, int num2)
{
return num1 + num2
}
반환 형식만 다른 경우 문법에 맞지 않아 에러가 발생한다.
한편, 디폴트 매개변수와 다중 정의가 합쳐지면 어떻게 될까?
#include <iostream>
using namespace std;
int Add(int num1, int num2, int num3 = 30)
{
return num1 + num2 + num3;
}
int Add(int num1, int num2)
{
return num1 + num2;
}
int main()
{
cout << Add(10, 20) << endl;
return 0;
}
결과값:
오류(활성) E0308 오버로드된 함수 "Add"의 인스턴스 중 두 개 이상이 인수 목록과 일치합니다.
오류 C2668 'Add': 오버로드된 함수에 대한 호출이 모호합니다.
모호성의 문제로 에러가 발생한다. 컴파일러 입장에선 어떤 함수를 호출할지 명확하지 않다는 것이다. 따라서 가급적 디폴트 매개변수 사용을 자제해야한다. 하지만, 함수의 다중 정의는 사용자의 편의성과 확장성의 이점이 있다. 디폴트 매개변수의 문제점을 해결할 수 있는 것이 템플릿이다.
템플릿이란?
C++에는 템플릿이라는 것이 있다. 템플릿은 일종의 '틀'과 같다.
#include <iostream>
using namespace std;
template <typename T>
T Add(T a, T b)
{
return a + b;
}
int main()
{
cout << Add(10, 20) << endl;
cout << Add(1.1, 2.2) << endl;
//cout << Add(1, 2.2) << endl; 에러 매개변수 불일치
return 0;
}
결과값:
30
3.3
typename은 자료형을 의미하고 T는 자료형이다. 가급적이면 함수 다중 정의보다 함수 템플릿을 사용하는 것을 권한다.
'C++' 카테고리의 다른 글
[C++] 참조자(Reference) (0) | 2019.12.16 |
---|---|
[C++] this 포인터 (0) | 2019.12.15 |
[C++] 클래스와 메소드 (0) | 2019.12.15 |
[C++] 네임스페이스(Namespace) (0) | 2019.12.14 |
[C++] 디폴트 매개변수 (0) | 2019.12.13 |