C++ Default Parameter - 4. Default Parameter와 함수 오버로딩
2025. 3. 27. 13:24ㆍ프로그래밍 언어/C++
✅ 4. Default Parameter와 함수 오버로딩
📌 1. Default Parameter vs 함수 오버로딩: 개념 비교
항목 | Default Parameter | 함수 오버로딩 (Function Overloading) |
정의 방식 | 하나의 함수에서 매개변수에 기본값을 설정함 | 동일한 함수 이름으로 인자의 수나 타입이 다른 함수 정의 |
호출 방식 | 생략된 인자 자리에 기본값이 자동 대입됨 | 인자 개수나 타입에 따라 가장 적합한 함수가 선택됨 |
코드 중복 여부 | 코드 중복 없이 간결하게 구성 가능 | 유사한 기능을 여러 함수로 나누어 정의해야 할 수 있음 |
유연성 | 인자 생략이 가능해 호출이 간편함 | 다양한 타입 또는 시나리오에 따라 기능을 명확히 분리 가능 |
유지보수 측면 | 기본값 변경 시 전체 호출부에 영향 | 각 오버로딩 함수가 독립적이므로 영향 범위가 좁음 |
✅ 기본 인자는 함수를 간결하게 만들고,
✅ 오버로딩은 기능을 명확히 분리하는 데 적합합니다.
📌 2. 두 기능을 혼합했을 때의 사용법과 장점
기본 인자와 오버로딩을 함께 사용하면 하나의 함수 이름으로 다양한 호출 방식을 제공할 수 있습니다.
✅ 장점
- 기본 인자로 자주 쓰는 기본 동작을 간결하게 처리
- 오버로딩으로 타입이나 의미가 다른 경우를 분리
예시: 로깅 함수
void log(std::string msg, int level = 1); // 기본 사용
void log(const std::vector<std::string>& msgs); // 다중 메시지 처리
log("Hello"); // level = 1
log({"Msg1", "Msg2"}); // 벡터 오버로딩 사용
🎯 같은 이름의 함수로 직관적 사용 가능, 단 호출 조건은 명확히 구분되도록 설계해야 합니다.
📌 3. 호출 모호성 문제와 해결 전략
기본 인자와 오버로딩을 혼용할 때 호출 조건이 겹치면 컴파일 에러가 발생할 수 있습니다.
❌ 모호한 예
void show(std::string msg);
void show(std::string msg, int repeat = 1);
show("Hello"); // 두 함수 모두 해당됨 → 컴파일 오류
✅ 해결 전략
- 기본 인자는 하나의 함수에만 사용
- 유사한 인자 구성을 피하거나, 명확히 분리
- 의미 차이가 크면 함수 이름을 분리하는 것도 방법
// 개선된 설계
void show(std::string msg, int repeat = 1); // 하나만 사용
📌 4. 오버로딩과 기본 인자 중 어떤 것이 우선 적용되는가?
C++ 컴파일러는 다음 순서로 함수 호출을 판단합니다:
- 정확히 일치하는 함수 시그니처 확인
- 타입 변환 없이 호출 가능한 오버로딩 함수 선택
- 해당 사항 없을 경우 → 기본 인자 적용
예시:
void log(int level);
void log(int level, std::string msg = "Info");
log(1); // → log(int) 호출됨 (정확히 일치하므로)
✅ 오버로딩이 우선 적용, 기본 인자는 보조 수단으로 간주됩니다.
📌 5. 실제 라이브러리 예시
✅ STL 예시: std::vector::assign
// 두 가지 방식의 오버로딩
template <class InputIterator>
void assign(InputIterator first, InputIterator last); // 범위 기반
void assign(size_type n, const T& val); // 개수 + 값
- 서로 다른 인자 타입과 개수로 오버로딩
- 유연한 초기화 방식 제공
✅ Boost 예시: boost::asio::ip::tcp::resolver::resolve
auto result1 = resolver.resolve(query); // 기본
auto result2 = resolver.resolve("localhost", "http"); // 문자열 오버로딩
- 오버로딩과 기본 인자를 혼용하여 편의성과 명확성을 동시에 확보
📌 6. 후속 코드 변경 시 영향 범위
항목 | 기본 인자 변경 시 | 오버로딩 변경 시 |
영향 범위 | 해당 함수 호출부 전체에 광범위한 영향 발생 가능 | 해당 오버로딩만 영향을 받음 (국소적) |
컴파일 영향 | 변경 시 모든 호출부 재컴파일 가능성 있음 | 특정 함수만 변경되므로 영향도 적음 |
유지보수 측면 | 변경 시 전역 영향 → 신중한 관리 필요 | 개별 함수 수정 가능 → 부분 유지보수 용이 |
예시:
void connect(std::string host = "localhost", int port = 3306);
- port 기본값을 변경하면 → connect()를 사용하는 모든 코드에 의미 변화 발생
// 오버로딩 예시
void connect(); // 기본 포트 사용
void connect(std::string host, int port); // 명시적 설정
- 명시적 호출에는 영향 없음 → 기능별 분리가 명확
📌 핵심 요약 표
항목 | 설명 |
혼합 사용 장점 | 다양한 호출 방식과 유연한 기본값 설정을 하나의 이름으로 처리 가능 |
호출 모호성 해결법 | 기본 인자는 단일 함수에만 사용, 오버로딩은 명확히 분리 |
컴파일 판단 순서 | 오버로딩 > 기본 인자 |
실무 사례 | STL, Boost 등에서 오버로딩 중심 사용, 일부 기본 인자 혼용 |
유지보수 시 영향 비교 | 기본 인자 변경 시 전체 영향, 오버로딩은 국소적 영향 |
설계 권장 사항 | 동작이 동일할 땐 기본 인자, 의미가 다르면 오버로딩 활용 |
'프로그래밍 언어 > C++' 카테고리의 다른 글
C++ Default Parameter - 6. 특수한 상황에서의 Default Parameter 활용 (0) | 2025.03.27 |
---|---|
C++ Default Parameter - 5. 주의사항 및 Best Practice (0) | 2025.03.27 |
C++ Default Parameter - 3. Default Parameter의 동작 원리 (0) | 2025.03.27 |
C++ Default Parameter - 2. 기본 문법과 사용법 (0) | 2025.03.27 |
C++ Default Parameter - 1. 기본 개념 이해 (0) | 2025.03.27 |