프로그래밍 언어/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 생성자 | 자동 형변환 방지 | 명시적 호출 필요, 오버로딩 혼동 방지 |