프로그래밍 언어/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: 오버로딩 대신 디폴트 인자를 적극 활용

  • 비슷한 시그니처가 여러 개 필요한 상황에서는 디폴트 인자를 통해 하나의 함수로 통합하는 것도 좋은 방법입니다.

🧠 요약

항목 설명
디폴트 매개변수 인자 생략 시 기본값을 설정
오버로딩과 병행 사용 가능하지만 주의 필요
모호성 오류 함수 호출 시 여러 후보가 가능할 때 발생
해결 방법 디폴트 제거, 타입 차별화, 명확한 함수 시그니처 설계 등