함수 오버로딩(function overloading)은 다른 매개 변수를 가진 같은 이름의 여러 함수들을 만들 수 있는 C++의 기능이다.
왜 이런걸 만들었을까?
이건 나중에 나올 연산자 오버로딩과 같은 개념에 사용되기 때문에 굉장히 유효하지만 지금 당장 그것에 대해 알 필요는 없는 것 같다.
#include <iostream>
int func(int a)
{
return a + 1;
}
double func(double a)
{
return a + 2;
}
int func(char c)
{
return c + 1;
}
int main(void)
{
std::cout << func(44) << std::endl;
return 0;
}
여기 이름이 같지만 매개변수가 다른 3개의 함수가 있다. 보통의 생각으로는 네이밍 충돌을 일으킬 것 같지만, C++에서는 그렇지 않다.
컴파일러는 함수 호출에 사용된 인자를 기반으로 func()을 선택할 수 있다. 위의 경우에는 int func(int) 함수가 호출될 것이다.
이렇듯 C++에서는 함수가 고유한 매개 변수를 가지고 있는 한 원하는 만큼 많은 오버로드된 add() 함수를 정의할 수 있다.
어떻게 이게 가능할까?
이 이유는 함수의 시그니처(signature)가 각각 다르기 때문이다. 함수 오버로딩에서 사용되는 함수의 시그니처는 다음 순서로 구성되어 있다.
1. 함수의 이름
2. 매개 변수의 개수
3. 매개변수의 타입 및 매개변수의 순서
즉, 이 3가지를 통해서 다양한 시그니처를 구성할 수 있고 컴파일러는 이것을 바탕으로 함수를 선택할 수 있는 것이다.
오버로딩에서 사용되는 함수의 시그니처를 보면 반환 타입이 없는 것을 알 수 있다.
그렇다. 반환 타입으로는 함수를 구분할 수가 없다.
double func(int); // 구분 못함
int func(int); // 구분 못함
그러니 이러한 실수를 하지 않도록 주의해야 한다.
'typedef' 선언은 새로운 타입을 만드는 것이 아니므로 아래의 두 선언은 동일하게 간주되니 조심해야 한다.
typedef int hello;
void print(hello value);
void print(int value); // 에러
이 외에도 조심해야 할 부분이 있지만 정확하게 명시하는 것을 잊지 않는다면 일어나지 않을 에러들이다.
C++ 프렌드 (0) | 2023.08.05 |
---|---|
C++ 생성자, 파괴자, 복사 생성자, 복사 대입 연산자 (0) | 2023.08.03 |
C++ 참조자(reference) (0) | 2023.08.03 |
C++ 클래스 (0) | 2023.08.03 |
OOP란? (0) | 2023.08.03 |