프로그래밍 언어/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 등)에서도 다양한 방식으로 기본 인자 개념을 활용하고 있습니다.