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++ 컴파일러는 다음 순서로 함수 호출을 판단합니다:

  1. 정확히 일치하는 함수 시그니처 확인
  2. 타입 변환 없이 호출 가능한 오버로딩 함수 선택
  3. 해당 사항 없을 경우 → 기본 인자 적용

예시:

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 등에서 오버로딩 중심 사용, 일부 기본 인자 혼용
유지보수 시 영향 비교 기본 인자 변경 시 전체 영향, 오버로딩은 국소적 영향
설계 권장 사항 동작이 동일할 땐 기본 인자, 의미가 다르면 오버로딩 활용