프로그래밍 언어/C++
C++ 함수 오버로딩 - 5. 디폴트 매개변수와의 관계
개발_노트
2025. 3. 26. 21:13
✅ 5. 디폴트 매개변수와의 관계
C++에서는 함수 오버로딩과 디폴트 매개변수를 동시에 사용할 수 있지만,
조합을 잘못하면 컴파일러가 어떤 함수를 호출해야 할지 결정하지 못해 "모호성 오류"가 발생할 수 있습니다.
📌 5-1. 디폴트 매개변수가 있는 함수의 오버로딩
🔍 기본 개념
- 디폴트 매개변수는 인자가 생략되었을 때 기본값을 자동으로 대입해주는 기능입니다.
- 오버로딩과 함께 사용할 수 있지만, 컴파일러는 호출 시점에 어떤 함수를 선택할지 판단해야 하므로 주의가 필요합니다.
✔ 예제: 디폴트 인자 있는 함수 + 오버로딩
#include <iostream>
using namespace std;
void greet(string name = "방문자") {
cout << "안녕하세요, " << name << "님!" << endl;
}
void greet(int times) {
for (int i = 0; i < times; ++i)
cout << "안녕하세요!" << endl;
}
int main() {
greet(); // greet(string) 호출 → "방문자"
greet(3); // greet(int) 호출 → 3번 출력
}
✅ 이 경우엔 명확하게 구분되므로 오버로딩과 디폴트 인자가 잘 조화됩니다.
📌 5-2. 모호성(Ambiguity) 문제와 해결법
⚠ 예제: 컴파일러가 어떤 함수를 호출해야 할지 알 수 없는 경우
void func(int a, int b = 10);
void func(int a);
int main() {
func(5); // ❌ 어떤 함수를 호출해야 할지 모호 → 컴파일 오류!
}
🔍 왜 오류가 날까?
- func(5); 호출 시, 두 함수 모두 호출 가능한 후보입니다:
- func(int a) → 정확히 일치
- func(int a, int b = 10) → b에 디폴트 인자를 넣어서 호출 가능
- 컴파일러는 "가장 적합한 함수"를 고르지 못하고 모호함(ambiguity) 오류를 발생시킵니다.
🛠 해결 방법
✅ 방법 1: 디폴트 매개변수를 제거하거나 위치 조정
void func(int a); // 기본 버전
void func(int a, int b); // 디폴트 제거하여 명확성 확보
✅ 방법 2: 완전히 다른 매개변수 시그니처 사용
void func(string s); // 타입 다르게
void func(int a, int b = 10); // 명확성 보장
✅ 방법 3: 오버로딩 대신 디폴트 인자를 적극 활용
- 비슷한 시그니처가 여러 개 필요한 상황에서는 디폴트 인자를 통해 하나의 함수로 통합하는 것도 좋은 방법입니다.
🧠 요약
항목 | 설명 |
디폴트 매개변수 | 인자 생략 시 기본값을 설정 |
오버로딩과 병행 사용 | 가능하지만 주의 필요 |
모호성 오류 | 함수 호출 시 여러 후보가 가능할 때 발생 |
해결 방법 | 디폴트 제거, 타입 차별화, 명확한 함수 시그니처 설계 등 |