오버로딩 (Overloading)
오버로딩은 같은 이름의 함수를 여러 개 정의하는 것이다.
단, 함수 이름은 같아도 매개변수의 형태가 달라야 한다.
기본 예시
void Func(int x);
void Func(float x);
void Func(int x, int y);
위 함수들은 모두 이름이 Func로 같지만, 매개변수가 다르기 때문에 오버로딩이 가능하다.
오버로딩이 가능한 기준
함수의 매개변수 목록이 달라야 한다.
void Func(int x);
void Func(float x);
void Func(int x, int y);
void Func(float x, int y);
가능한 차이
- 매개변수 개수 차이
- 매개변수 타입 차이
- 매개변수 순서 차이
매개변수 개수 차이
void Func(int x);
void Func(int x, int y);
매개변수 타입 차이
void Func(int x);
void Func(float x);
매개변수 순서 차이
void Func(int x, float y);
void Func(float x, int y);
오버로딩이 불가능한 경우
반환형만 다른 함수는 오버로딩할 수 없다.
int Func(int x);
float Func(int x); // 오류
함수를 호출할 때 반환형만 보고 어떤 함수를 호출할지 결정할 수 없기 때문이다.
Func(10);
위 코드만 보면 int를 반환하는 함수인지 float를 반환하는 함수인지 알 수 없다.
오버로딩 호출 예시
#include <iostream>
using namespace std;
void Func(int x)
{
cout << "int 함수" << endl;
}
void Func(float x)
{
cout << "float 함수" << endl;
}
void Func(int x, int y)
{
cout << "int 2개 함수" << endl;
}
int main()
{
Func(10);
Func(3.14f);
Func(10, 20);
}
실행 결과
int 함수
float 함수
int 2개 함수
모호성 오류
오버로딩된 함수 중 어떤 함수를 호출해야 할지 컴파일러가 결정하지 못할 때 발생한다.
void Func(long x);
void Func(double x);
Func(10);
10은 int 리터럴이다.
int는 long으로도 변환할 수 있고, double로도 변환할 수 있다.
그래서 두 함수 모두 호출 후보가 된다.
Func(long)
Func(double)
컴파일러가 어느 쪽을 선택해야 할지 결정하지 못하면 모호성 오류가 발생한다.
해결 방법
호출할 함수의 타입을 명확하게 지정하면 된다.
형변환 사용
Func(static_cast<long>(10));
또는
Func((long)10);
타입 접미사 사용
Func(10L);
10L은 long 타입 리터럴이다.
double 호출
Func(10.0);
또는
Func(static_cast<double>(10));
주의할 점
오버로딩을 너무 많이 만들면 어떤 함수가 호출되는지 헷갈릴 수 있다.
특히 다음처럼 비슷한 타입이 많으면 주의해야 한다.
void Func(short x);
void Func(long x);
void Func(float x);
void Func(double x);
정리
- 오버로딩은 같은 이름의 함수를 여러 개 정의하는 것이다.
- 매개변수의 개수, 타입, 순서가 달라야 한다.
- 반환형만 다른 함수는 오버로딩할 수 없다.
- 컴파일러는 전달된 인자의 타입을 보고 호출할 함수를 결정한다.
- 여러 함수가 동시에 후보가 되면 모호성 오류가 발생할 수 있다.
- 형변환이나 타입 접미사를 사용하면 모호성을 해결할 수 있다.