프로그래밍 언어/C++
C++ Default Parameter - 2. 기본 문법과 사용법
개발_노트
2025. 3. 27. 13:09
✅ 2. 기본 문법과 사용법
📌 기본 인자의 문법적 구조
기본 인자(Default Parameter)는 함수의 매개변수에 미리 지정한 기본값을 설정하여,
함수 호출 시 인자를 생략할 수 있도록 해주는 문법입니다.
// b에 기본값 10을 설정
int add(int a, int b = 10);
add(5); // a = 5, b = 10 (b 생략됨)
add(5, 20); // a = 5, b = 20 (b 명시적으로 전달)
✅ 함수 호출 시 생략된 인자는 기본값으로 자동 대체됩니다.
📌 여러 매개변수에서 Default Parameter 지정 시 유의사항
C++에서는 기본 인자를 매개변수의 오른쪽부터 순서대로 지정해야 합니다.
// ❌ 오류 발생: 기본 인자가 왼쪽에만 있음
int multiply(int a = 2, int b); // 컴파일 에러 발생
// ✅ 올바른 형태
int multiply(int a, int b = 2);
multiply(5); // a = 5, b = 2
multiply(5, 3); // a = 5, b = 3
❗ 중간 인자만 생략하는 형태(multiply(, 3))는 지원되지 않습니다.
📌 오른쪽부터 지정해야 하는 이유
C++은 함수 인자를 왼쪽부터 순서대로 채워 넣기 때문에,
오른쪽 매개변수가 생략되었다는 것을 명확히 판단할 수 있어야 합니다.
void show(int a = 1, int b = 2);
show(); // a = 1, b = 2
show(5); // a = 5, b = 2
show(5, 10); // a = 5, b = 10
// ❌ show(, 10); // 오류: 중간 생략 불가
📌 함수 선언과 정의 분리 시 기본 인자 위치
기본 인자는 선언부에만 작성하는 것이 안전하며 권장되는 방식입니다.
// 선언부 (보통 헤더 파일)
void greet(std::string name = "Guest");
// 정의부 (소스 파일)
void greet(std::string name) {
std::cout << "Hello, " << name << std::endl;
}
greet(); // 출력: Hello, Guest
greet("Alice"); // 출력: Hello, Alice
🔸 선언과 정의에 기본 인자를 중복 지정하거나 다르게 설정하면 예기치 않은 오류가 발생할 수 있습니다.
📌 다양한 형태의 기본 인자 사용 예시
기본 인자는 단순한 리터럴뿐만 아니라 다양한 표현으로 지정할 수 있습니다.
단, 컴파일 타임에 평가 가능한 값이어야 합니다.
const int DefaultVal = 42;
int compute(int a = 10, int b = DefaultVal, int c = 2 + 3);
std::string greet(std::string name = "Guest");
int getDefault() { return 100; }
int getValue(int x = getDefault()); // getDefault는 선언 전에 정의되어 있어야 함
형태 | 예시 | 설명 |
상수 | int x = 5 | 가장 기본적인 형태입니다. |
상수 표현식 | int x = 2 + 3 | 간단한 연산도 가능합니다. |
열거형 상수 | Color c = RED | enum 활용 가능 |
const 전역 변수 | int port = DefaultPort | 단, 컴파일 타임 상수여야 함 |
함수 호출 결과 | int x = getDefault() | 선언보다 먼저 정의되어야 함 |
nullptr | int* p = nullptr | 포인터 기본값에 자주 사용됨 |
📌 기본 인자로 사용할 수 있는 값의 제한 (경계 조건)
C++에서 기본 인자로 지정할 수 있는 값에는 몇 가지 제약이 있습니다.
구분 | 허용 여부 | 설명 |
리터럴/상수 | ✅ | 정수, 실수, 문자, 문자열 등 |
const 전역 변수 | ✅ | 단, 반드시 컴파일 타임 상수여야 함 |
constexpr | ✅ | C++11 이후 권장 방식 |
지역 변수 | ❌ | 함수 내부 변수는 사용할 수 없음 |
비정적 멤버 변수 | ❌ | 클래스 인스턴스가 필요하므로 불가 |
정적(static) 멤버 변수 | ✅ | 가능 |
함수 호출 | ⛔ 조건부 허용 | 함수가 선언 전에 정의되어 있어야 하며, 컴파일 타임 평가 가능해야 함 |
void func() {
int local = 5;
// int f(int x = local); // ❌ 컴파일 오류: 지역 변수는 사용 불가
}
📌 주요 규칙 및 주의사항 요약표
항목 | 규칙 / 주의사항 |
기본 인자 지정 순서 | 오른쪽부터 순차적으로 지정해야 합니다. |
선언 vs 정의 | 선언부에만 기본값을 명시하는 것이 안전합니다. |
생략 가능 조건 | 기본 인자가 지정된 매개변수는 생략 가능합니다. |
중간 생략 | 중간 인자만 생략하는 것은 허용되지 않습니다. |
함수 호출 결과 사용 | 함수는 선언보다 앞서 정의되어 있어야 하며, 조건부로 허용됩니다. |
지역 변수 사용 금지 | 지역 변수는 기본 인자로 지정할 수 없습니다. |
오버로딩과 혼용 주의 | 호출 모호성이 발생할 수 있으므로 신중하게 설계해야 합니다. |