오버로딩 - 함수 다중 정의
int Add(int a, int b){ return a + b;}
double Add(double a, double b) { return a + b;}
int main(){
std::cout << Add(3,4) << std::endl;
std::cout << Add(3.4, 4.5) << std::endl;
}
이처럼 형태가 다른 (매개변수가 다른) 같은 이름의 함수가 여러개 공존
할 수 있다. 이런 문법을 오버로딩
이라고 한다.
C++은 오버로딩을 통해서 함수의 다형성
을 지원한다
모호성
void TestFunc(int a){
std::cout << a << std::endl;
} // 1번
void TestFunc(int a, int b = 10){
std::cout << a <<" " << b << std::endl;
} // 2번
int main(){
TestFunc(3);
}
이렇게 함수를 호출하게되면 우리가 호출하려는 함수가 1번인지 2번지 모호해져 에러가 발생하게 된다.
이렇게 함수의 원형
을 정확하게 알수없게
되는것을 모호성
이라고 한다.
디폴트 파라미터
나 오버로딩
을 남발하게 되 모호성이 존재하는 코드가 많아지면 만약 에러가 발생하지 않더라도 함수의 호출부분에서 함수를 정확히 할수 없게 되어 유지보수가 어려워지게 된다
.
그래서 C++에서 최대한 모호성을 제거
하는것이 중요하고 그렇기 떄문에 꼭 필요한 경우를 제외하고는 오버로딩
이나 디폴트 파라미터
를 줄이고 함수 템플릿
을 사용하는것이 좋다.
함수 템플릿
template <typename T>
T Add(T a, T b){ return a+b;}
int main(){
std::cout << Add(3,4) << std::endl;
std::cout << Add(3.4, 4.5) << std::endl;
}
템플릿
은 형식을 기술할 자리를 비워놓고
호출자쪽에서 매개변수를 통해 형식을 채워준다.
템플릿을 사용하면 실제로는 위의 오버로딩된 함수와 똑같이 작동하기 때문에 같은 이름의 코드를 여러번 정의하지 않고도 다형성을 챙길수 있어 유지보수에 용이하다.
Name Mangling
내부적으로 보면 각 함수마다 따로 고유한 이름
들이 존재하고 컴파일을 할때 함수들의 이름이 이 고유한 이름으로 변경된다.
이걸 NameMangling
이라고 하며 이로 인해 오버로딩
이나 오버라이딩
같은 문법이 가능해진다.
extern "C" int Add(int a, int b);
extern "C"
키워드를 통해서 이 NameMangling이 작동하지 않게 할수있다.