프로그래밍 언어/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 정의 선언부에만 기본값을 명시하는 것이 안전합니다.
생략 가능 조건 기본 인자가 지정된 매개변수는 생략 가능합니다.
중간 생략 중간 인자만 생략하는 것은 허용되지 않습니다.
함수 호출 결과 사용 함수는 선언보다 앞서 정의되어 있어야 하며, 조건부로 허용됩니다.
지역 변수 사용 금지 지역 변수는 기본 인자로 지정할 수 없습니다.
오버로딩과 혼용 주의 호출 모호성이 발생할 수 있으므로 신중하게 설계해야 합니다.