프로그래밍 언어/C++

C++ Default Parameter - 7. 실전 예제 및 활용 사례

개발_노트 2025. 3. 27. 16:34

 

✅ 7. 실전 예제 및 활용 사례


📌 1. 기본 인자를 활용한 함수 설계 예제

기본 인자는 자주 생략되는 인자에 적절한 기본값을 지정하여 함수 호출을 간결하고 직관적으로 만듭니다.

void log(std::string message, int level = 1) {
    std::cout << "[Level " << level << "] " << message << '\n';
}

log("Server started");           // 기본 level 사용
log("Critical error", 3);        // 명시적 level 지정

✅ 기본 인자는 간단한 함수 호출을 자주 사용하는 환경에서 유용합니다.


📌 2. 함수 오버로딩과의 조합을 통한 코드 최적화

기본 인자는 간결함을, 오버로딩은 타입이나 동작의 의미적 차이를 처리하는 데 적합합니다.

void drawCircle(int radius, std::string color = "black");  // 간단한 버전
void drawCircle(double radius, double thickness);          // 정밀 제어용

🎯 기본 인자는 “값의 생략”,
🎯 오버로딩은 “기능 분기”에 사용하는 것이 이상적입니다.


📌 3. 유지보수성과 가독성을 고려한 설계 패턴

  • 하드코딩된 값 대신 상수(const) 사용
  • 인자 순서를 명확히 하여 가독성 향상
const int DefaultPort = 3306;

void connect(std::string host = "localhost", int port = DefaultPort);

✅ 기본 인자를 상수로 분리하면, 변경 시 영향도 파악과 테스트가 쉬워집니다.


📌 4. 복잡한 실전 예제: DB 연결 함수

기본 인자를 조합하여 다수의 선택적 설정이 있는 함수를 단순화할 수 있습니다.

void connectDB(
    std::string host = "localhost",
    int port = 3306,
    std::string user = "root",
    std::string password = "",
    int timeout = 5
) {
    std::cout << "Connecting to " << host << ":" << port
              << " as " << user << " (timeout: " << timeout << "s)\n";
}
connectDB();  // 전부 기본값
connectDB("db.prod.com", 5432, "admin", "secret");

✅ 실제 실무에서 자주 사용되는 네트워크/데이터베이스 설정 함수에 적합한 패턴입니다.


📌 5. Builder 패턴과의 비교

기본 인자만으로는 선택적 매개변수가 많을 경우 확장성과 가독성이 떨어질 수 있습니다.
이럴 때는 Builder 패턴이 적합합니다.

✅ Builder 패턴 예시

class DBConfig {
public:
    DBConfig& host(std::string h) { _host = h; return *this; }
    DBConfig& port(int p) { _port = p; return *this; }
    DBConfig& user(std::string u) { _user = u; return *this; }

    void connect() const {
        std::cout << "Connecting to " << _host << ":" << _port << " as " << _user << '\n';
    }

private:
    std::string _host = "localhost";
    int _port = 3306;
    std::string _user = "root";
};

DBConfig().host("db.prod").port(5432).user("admin").connect();
비교 항목 기본 인자 Builder 패턴
사용 목적 간단한 생략 처리 복잡한 선택적 설정 처리
호출 형태 함수 호출 시 인자 생략 메서드 체인 방식으로 설정
확장성 인자 수 많아지면 복잡해짐 구조적으로 확장 가능
가독성 인자 순서 필요 명시적 키워드로 순서 무관

✅ Builder 패턴은 선택 항목이 많거나 조합이 유동적인 경우에 적합합니다.


📌 6. 실제 라이브러리에서의 활용 사례

✅ STL – std::vector::assign

std::vector<int> v;
v.assign(5, 100);  // 5개의 요소를 100으로 초기화
  • 다양한 오버로딩으로 기본 동작을 유사하게 구현
  • 사용자 입장에서는 기본값처럼 활용 가능

✅ Boost.Program_options – default_value

desc.add_options()
    ("threads", po::value<int>()->default_value(4), "number of threads");
  • 옵션 설정 시, 사용자 입력이 없을 경우 기본값 자동 적용

✅ fmt – fmt::print

fmt::print("Hello, {}\n", "World");  // 내부에서 기본 서식 처리
  • 명시적 기본 인자는 없지만, 호출을 단순화하기 위해 내부적으로 기본값 처리를 포함

📌 7. 설계 방식 비교 표

항목 기본 인자 함수 오버로딩 Builder 패턴 정책 기반 설계 (Policy)
코드 간결성 ✅ 매우 높음 ❌ 중복 정의 증가 가능 ⭕ 적당함 ❌ 복잡함
호출 유연성 ✅ 인자 생략 가능 ✅ 타입/기능 분리 용이 ✅ 설정 자유도 높음 ✅ 조합 설계 가능
유지보수/확장성 ❌ 인자 많아지면 한계 ❌ 오버로드 충돌 가능 ✅ 유연한 확장 가능 ✅ 설계 전략에 따라 유연하게 변경 가능
추천 상황 단순 함수 기능 차이 큼 옵션 많고 복잡한 설정 전략/행동 조합이 필요한 라이브러리 설계

📌 핵심 요약

  • 기본 인자는 간단한 생략 처리에 효과적이며 함수 호출을 깔끔하게 만듭니다.
  • 오버로딩은 입력 타입/기능에 따라 명확하게 구분되는 경우에 적합합니다.
  • Builder 패턴은 매개변수가 많거나 선택적 조합이 복잡할 때 추천됩니다.
  • 정책 기반 설계는 동작 전략을 외부화해 확장성과 테스트 용이성을 확보합니다.
  • ✅ 실제 라이브러리(STL, Boost, fmt 등)에서도 다양한 방식으로 기본 인자 개념을 활용하고 있습니다.