프로그래밍 언어/C++

C++ 함수 오버로딩 - 10. 함수 오버로딩 시 주의할 점

개발_노트 2025. 3. 26. 21:48

 

✅ 10. 함수 오버로딩 시 주의할 점


📌 10-1. 모호한 호출(Ambiguous Call) 방지

🔍 개념

오버로딩된 함수가 너무 비슷하거나 디폴트 인자를 함께 사용할 경우,
컴파일러가 어떤 함수를 호출해야 할지 결정하지 못하는 상황이 발생합니다.
이를 모호한 호출(ambiguity)이라고 하며, 컴파일 오류로 이어집니다.

✔ 예제 – 오류 발생:

void func(int a);
void func(int a, int b = 0);

int main() {
    func(5); // ❌ 모호함: 둘 다 호출 가능 → 컴파일 오류
}

✔ 해결 방법:

  • 디폴트 인자를 없애거나,
  • 함수 시그니처를 명확히 다르게 구성
void func(int a);            
void func(int a, double b);  // ✅ 명확히 구분됨

📌 10-2. using 키워드와 네임스페이스에서의 오버로딩

🔍 개념

C++에서 네임스페이스를 사용하다 보면
오버로딩된 함수들이 다른 범위에 존재할 수 있으며,
이때 using 키워드를 통해 이름만 가져오면 일부 오버로딩 버전만 활성화되는 문제가 발생할 수 있습니다.

✔ 예제:

namespace Base {
    void show(int);
    void show(double);
}

using Base::show;

void show(string);

int main() {
    show(10);        // ✅ Base::show(int)
    show("hello");   // ✅ 전역 show(string)
    // show(3.14);   // ❌ Base::show(double)은 using에 포함되지 않음 → 오류
}

💡 해결 방법: using 시 오버로딩 함수 전체를 명시하거나, 필요한 함수만 선택적으로 가져와야 함.


📌 10-3. explicit 키워드와 오버로딩의 관계

🔍 개념

explicit 키워드는 단일 인자를 받는 생성자에서 자동 형변환을 방지하는 데 사용됩니다.
이를 통해 오버로딩 시 예상치 못한 암시적 호출을 차단할 수 있습니다.

✔ 예제:

class MyClass {
public:
    MyClass(int) { cout << "int 생성자 호출\n"; }
    MyClass(double) { cout << "double 생성자 호출\n"; }
};

void process(MyClass obj) {
    cout << "객체 처리 중\n";
}
int main() {
    process(10);    // int → MyClass 암시적 변환 → 호출됨
    process(3.14);  // double → MyClass 변환 → 호출됨
}

✔ explicit 적용 시:

class MyClass {
public:
    explicit MyClass(int) { cout << "int 생성자 호출\n"; }
    MyClass(double) { cout << "double 생성자 호출\n"; }
};
int main() {
    process(10); // ❌ 암시적 변환 불가 → 컴파일 오류
    process(MyClass(10)); // ✅ 명시적 생성자 호출 필요
}

✅ explicit을 활용하면 불명확하거나 위험한 오버로딩을 명시적으로 제한할 수 있습니다.


🧠 정리 요약표

항목 설명 주의 사항
모호한 호출 시그니처가 비슷하거나 디폴트 인자 혼용 시 발생 컴파일 오류 유발
using 키워드 오버로딩 함수가 일부만 적용될 수 있음 네임스페이스 전체 관리 주의
explicit 생성자 자동 형변환 방지 명시적 호출 필요, 오버로딩 혼동 방지