Programming Language/C,C++

함수 오버로딩과 디폴트 매개변수가 만드는 모호성

TwinParadox 2018. 6. 14. 10:02
728x90

함수 오버로딩(Function Overloading)

함수 다중 정의라고도 하며 아래 조건을 만족시킬 때 함수가 오버로딩 되었다고 말한다.



1. 함수명은 동일해야 하며 반환형은 동일해도 되고 동일하지 않아도 된다.

2. 매개 변수의 수가 다를 때

3. 매개 변수의 수는 같은데 자료형이 다를 때


ex)

void Foo(int a);

void Foo(int a, int b);





디폴트 매개 변수(Default Parameter)

함수의 매개 변수 값을 미리 지정해두는 방법으로, 선언 시점에 이를 작성한다. 함수를 호출할 때 실인수는 좌에서 우로 적용되기 때문에 디폴트 매개 변수는 오른쪽에서 왼쪽 방향으로 지정해야 한다.



ex)

void foo(int a, int b=10);

foo(2); // a=2, b=10

foo(3,4); // a=3, b=4



이 두 가지를 같이 쓰면 어떻게 될까?



void TestFunc(int a, int b = 4)
{
	std::cout << a << ' ' << b;
}
void TestFunc(int a)
{
	std::cout << a;
}
int main(void)
{
	TestFunc(4);
}


위 소스는 TestFunc라는 함수를 오버로딩하기도 했고, 함수의 매개변수에 디폴트 매개변수를 사용하기도 했다. main 함수에서 저렇게 함수를 호출을 하면 어떻게 접근을 해야 할까? 이처럼 디폴트 매개변수와 함수 오버로딩을 같이 사용하면 강력한 모호성이 발생한다. Visual Studio에서는 'E0308 오버로드된 함수 "TestFunc"의 인스턴스 중 두 개 이상이 인수 목록과 일치합니다.'라는 오류 메세지를 보여주면서 이 모호성을 해결하라고 지시한다.


애당초 이런 모호성이 심한 코드는 작성하지 않는 것이 좋다. 컴파일러가 허가하지 않는 것도 있지만, 모호성이 있는 코드는 추후 유지 보수 단계에서 골치 아픈 문제를 가져오기 때문이다.


728x90
728x90