Function Overloading
함수 오버로딩
- Function Polymorphism(함수의 다형; 함수의 다양한 형태)을 C++에서 구현하는 방법이다.
- 서로 다른 여러 개의 함수가 하나의 이름을 공유하게 하는 방법이다.
- 함수 오버로딩은 본질적을 같은 일을 처리하지만, Function Signature(매개변수 리스트에 대한 정보)* 가 서로 다른 여러 개의 함수를 하나의 이름으로 만들 수 있게 한다.
(오버로딩된 함수들 마다 논리적으로 다른 작업을 수행하게 구현할 수도 있으나, 기본적으로 같은 작업을 수행하도록 구현하는 것이 코드 가독성 측면에서 바람직하다.)
- 오버로딩된 함수들은 오직 함수 시그니처에 의해서만 구분지어지며, 함수의 리턴 데이터형과는 관계가 없다.
(위와 같은 이유에서, 함수 시그니처가 같고 리턴형만 다른 두 함수는 오버로딩되지 않는다.)
- 컴파일러는 문맥을 파악하여 오버로딩된 여러 함수 후보들 중 하나를 선택하게 된다.
- 함수 호출과정 중, 대응하는 함수 원형이 없어 모호한 경우에 컴파일러는 이러한 함수 호출을 에러로 간주한다.
- 참조 매개변수의 경우, 함수 호출부에서 일반적인 데이터형과 구분할 수 없으므로,
특정 데이터형의 참조형과 특정 데이터형 그 자체는 같은 시그니처라고 여긴다.
* Function Signature(함수 시그니처) : 함수 내에 매개변수의 개수, 데이터형, 매개변수 순서와 같은 매개변수의 정보들을 일컫는 용어이며, 함수 시그니처가 같다고 하는 말은 위 3개의 정보들이 동일한 경우임을 의미한다.
Overloading Reference Parameter (오버로딩 참조 매개변수)
- 오버로딩된 함수들은 다른 종류의 참조형과 상호작용하며 포괄적으로 매개변수를 받아들인다.
- 특히, 클래스 설계나 STL들은 종종 참조 매개변수를 사용한다.
Ex. 참조 매개변수들이 받아들이는 값의 종류 예시
void staff (double& r1); // r1은 L-Value와 매치된다.
void staff (const double&& r2); // r2는 R-Value와 매치된다.
void staff (const double& r3); // r3는 L-Value, const L-Value, R-Value와 매치된다.\
double x = 55.5;
const double y = 32.0;
staff(x); // 첫 번째 함수가 호출된다.
staff(y); // 두 번째 함수가 호출된다.
staff(x+y); // 세 번째 함수가 호출된다.
Name Decoration (이름 장식)
- 컴파일러가 오버로딩된 함수들을 구분하는 방법이다.
- 함수 원형에 지정되어 있는 함수 시그니처 정보를 기반으로 각각의 함수 이름을 암호화하여 구분한다.
- Name Mangling(이름 맹글링)이라고도 한다.
- 컴파일러의 종류마다 방식을 달리한다.
Ex. 이름 장식 기법의 예시
long MyFunctionFoo (int, float);
// 암호화
?MyFunctionFoo@@YAXH@Z