기본 매개변수
기본 매개변수 개요
기본 매개변수는 함수 선언 시 매개변수에 기본값을 지정하는 C++의 기능입니다.
이를 통해 함수 호출 시 일부 인자를 생략할 수 있어, 함수 사용의 유연성을 높일 수 있습니다.
기본 매개변수의 기본 문법
기본 매개변수는 함수 선언 시 다음과 같이 지정합니다.
#include <iostream>
#include <string>
void printMessage(std::string message, int times = 1) {
for (int i = 0; i < times; ++i) {
std::cout << message << std::endl;
}
}
int main() {
printMessage("Hello"); // "Hello" 한 번 출력
printMessage("Hello", 3); // "Hello" 세 번 출력
return 0;
}
이 예제에서 times
매개변수의 기본값은 1로 설정되어 있습니다.
기본 매개변수 사용 시 주의사항
- 기본값은 오른쪽부터 지정해야 합니다.
// 올바른 사용
void func(int a, int b = 0, int c = 0);
// 잘못된 사용
void func(int a = 0, int b, int c = 0); // 컴파일 오류
- 함수 선언과 정의에서 한 번만 지정해야 합니다. (보통 선언에서 지정)
// 헤더 파일
void func(int a, int b = 0);
// 소스 파일
void func(int a, int b /* = 0 */) {
// 함수 구현
}
- 재정의된 함수에서 기본 매개변수 변경 시 주의가 필요합니다.
class Base {
public:
virtual void func(int a = 10) { std::cout << "Base: " << a << std::endl; }
};
class Derived : public Base {
public:
void func(int a = 20) override { std::cout << "Derived: " << a << std::endl; }
};
int main() {
Base* ptr = new Derived();
ptr->func(); // "Derived: 10" 출력 - 기본값은 Base 클래스의 것을 사용
delete ptr;
return 0;
}
기본 매개변수와 함수 오버로딩
기본 매개변수는 함수 오버로딩과 함께 사용할 때 주의가 필요합니다.
void print(int a);
void print(int a, int b = 0); // 잠재적 모호성
int main() {
print(10); // 어떤 함수가 호출될까요? 컴파일 오류!
return 0;
}
기본 매개변수와 템플릿
템플릿에서도 기본 매개변수를 사용할 수 있습니다.
template <typename T = int>
void printValue(T value) {
std::cout << value << std::endl;
}
int main() {
printValue(5); // int 버전 사용
printValue(3.14); // double 버전 사용
printValue<float>(2.5f); // 명시적으로 float 버전 사용
return 0;
}
객체 지향 프로그래밍에서의 기본 매개변수
생성자에서 기본 매개변수를 사용하면 객체 생성을 더 유연하게 할 수 있습니다.
class Rectangle {
public:
Rectangle(int width = 1, int height = 1) : width_(width), height_(height) {}
int area() const { return width_ * height_; }
private:
int width_, height_;
};
int main() {
Rectangle r1; // 1x1 직사각형
Rectangle r2(5); // 5x1 직사각형
Rectangle r3(3, 4); // 3x4 직사각형
return 0;
}
기본 매개변수의 평가 시점
기본 매개변수는 함수 호출 시점에 평가됩니다.
#include <iostream>
#include <ctime>
std::string getCurrentTime() {
time_t now = time(0);
return ctime(&now);
}
void logMessage(const std::string& message, std::string timestamp = getCurrentTime()) {
std::cout << timestamp << ": " << message << std::endl;
}
int main() {
logMessage("First message");
std::this_thread::sleep_for(std::chrono::seconds(2));
logMessage("Second message");
return 0;
}
이 예제에서는 각 로그 메시지마다 현재 시간이 기록됩니다.
연습 문제
- 다양한 도형(원, 사각형, 삼각형)의 면적을 계산하는 함수를 기본 매개변수를 사용하여 구현하세요.
- 기본 매개변수를 이용한 간단한 로깅 시스템을 만드세요. 로그 레벨과 출력 대상을 기본 매개변수로 설정할 수 있어야 합니다.
- 다음 코드의 출력 결과를 예측해보고, 실제로 실행하여 확인해보세요. 결과가 예상과 다르다면 그 이유를 설명해보세요.
class Base {
public:
virtual void show(int x = 10) { std::cout << "Base: " << x << std::endl; }
};
class Derived : public Base {
public:
void show(int x = 20) override { std::cout << "Derived: " << x << std::endl; }
};
int main() {
Base* b = new Derived();
b->show();
delete b;
return 0;
}
참고자료
- C++ 공식 문서의 기본 인자 섹션 : Default arguments
- "Effective C++" by Scott Meyers (항목 38 : "타입이 중요한 부분"을 결정하는 데 있어 매개변수화 타입에 의존하지 마라)
- "C++ Templates : The Complete Guide" by David Vandevoorde, Nicolai M. Josuttis, and Douglas Gregor (Chapter 10 : 함수 템플릿)
- C++ Core Guidelines의 함수 관련 규칙 : F : Functions