C++ / 함수 오버로딩 모호성 문제 해결

지수·2025년 4월 28일

C++

목록 보기
2/2
post-thumbnail

함수 오버로딩 모호성 문제에 대해 공부해보았다

1. 문제 발생

#include <iostream>

int function(int a = 5) {
	return a + 1;
}

int function(void) {
	return 10;
}

int main(void) {
	std::cout << function() << std::endl;
	std::cout << function(3) << std::endl;
	return 0;
}

함수 시그니처가 다르기 때문에 실행될 것이라고 생각했지만, 실행되지 않았다.

이유는 디폴트 매개변수가 있는 함수의 경우

std::cout << function() << std::endl;
std::cout << function(3) << std::endl;

인자가 없는 경우와 있는 경우 모두 실행될 수 있기 때문인데,
따라서 C++ 컴파일러는 둘 다 후보 함수로 생각하게 된다.

2. 문제 해결

2-1) 해결 방법 1 : 디폴트 인자를 제거하거나 하나만 정의

int function(int a) {
    return a + 1;
}

또는

int function() {
    return 10;
}

이렇게 수정하여 모호성 문제가 발생하지 않도록 하는 방법이 있다.

2-2) 해결 방법 2 : 이름을 다르게 해서 오버로딩 문제 없애기

int functionWithParam(int a = 5) {
    return a + 1;
}

int function() {
    return 10;
}

위와 같이 함수의 이름을 바꾸게 되면 출력문도

std::cout << function() << std::endl;
std::cout << functionWithParam(3) << std::endl;

이렇게 바뀌기 때문에 모호성 문제가 발생하지 않게 되는 방법이다.

디폴트 매개변수를 설정한 것에는 이유가 있기 때문에 2번째 방법 처럼 이름을 바꾸는 것이 더 맞는 해결 방법인 것 같지만
함수의 이름을 같게 설정한 것에도 이유가 있을 것 같다는 생각든다...

3. 느낀점

디폴트 매개변수가 있는 함수와 매개변수가 없는 함수를 같이 선언하면,
인자 없이 호출할 경우 둘 다 호출될 수 있어서 모호성이 생긴다는 것을 알게 되었다.

오늘 선생님께 질문을 드렸고 실무에서는 위와 같은 모호성 문제가 발생하면 함수 이름을 수정하는 방법보다는 디폴트 인자를 제거하는 방식이 나을 것이라고 하셨다. 함수 이름이 같은 것에는 이유가 있고, 또 이름이 같은 함수는 오버로딩인 경우가 있기 때문이다.

이론 공부는 어렵지만 알 수록 코드를 작성하는데 도움이 되는 것 같아 더 열심히 공부하고 싶다!

profile
개발자 꿈나무 여고생

0개의 댓글