오버로딩 (overloading)
같은 이름의 메소드(method) 또는 생성자를 매개변수의 개수나 타입을 다르게 지정함으로써 2개 이상 정의하는 것
함수 오버로딩
- 함수를 호출할 때 매개변수를 보고 동작을 결정한다.
- 컴파일러에서 함수를 오버로딩하는 과정은 다음과 같다.
1. 인자 타입이 일치하는 함수를 찾는다.
2. 일치하는 인자 타입이 없는 경우 다음과 같은 형변환을 통해 일치하는 함수를 찾는다.
char, unsigned char, short ▶ int
unsigned short ▶ int의 크기에 따라 int 혹은 unsigned int
float ▶ double
enum ▶ int
3.형변환 후에도 일치하는 인자가 없다면 좀더 포괄적으로 형변환을 진행하여 일치하는 함수를 찾는다.
임의의 숫자 타입은 다른 숫자 타입으로 변환 ▶ ex) float -> int
enum도 임의의 숫자 타입으로 변환 ▶ ex) enum -> double
0 ▶ 포인터 타입이나 숫자 타입
포인터 ▶ void 포인터
4.유저 정의된 타입 변환으로 일치하는 것을 찾는다.
- 위의 모든 방법을 이용하더라도 함수를 찾을 수 없거나, 같은 단계에서 2개 이상의 함수가 발견되면 오류가 발생한다.
함수 오버로딩 예제
Ex) 매개변수 타입을 바꿔 오버로딩
#include <iostream>
using namespace std;
void sum(int, int);
void sum(float, float);
int main() {
sum(3, 7);
sum(3.4f, 7.2f);
return 0;
}
void sum(int a, int b) {
cout << "정수의 합: " << a + b << endl;
}
void sum(float a, float b) {
cout << "실수의 합: " << a + b << endl;
}
정수의 합: 10
실수의 합: 10.6
- 동일한 이름의 함수 sum의 매개변수 타입을 달리하여 함수 오버로딩을 구현하였다.
생성자 오버로딩
- 생성자도 함수이기 때문에 오버로딩이 가능하다.
- 생성자 오버로딩을 이용하여 멤버 변수를 다양하게 초기화할 수 있다.
생성자 오버로딩 예제
#include <iostream>
using namespace std;
class Date {
private:
int year;
int month;
int day;
public:
void printDate();
Date() {
year = 2002;
month = 2;
day = 2;
}
Date(int _year, int _month, int _day) {
year = _year;
month = _month;
day = _day;
}
};
void Date::printDate() {
cout << year << "년 " << month << "월 " << day << "일" << endl;
}
int main() {
Date date1;
Date date2(2023, 1, 4);
date1.printDate();
date2.printDate();
return 0;
}
2002년 2월 2일
2023년 1월 4일
- 생성자 오버로드를 통해 인스턴스마다 다른 값으로 멤버 변수를 초기화하였다.