본문 바로가기

프로그래밍기초/C++

[C++ Basic] # 05 C++ 매개변수 default 값


C++에서 메서드(함수) 매개변수의 기본값(default parameter)은 함수 선언에서 매개변수에 초기값을 지정하여 설정할 수 있습니다. 기본값이 설정된 매개변수는 함수 호출 시 생략할 수 있으며, 생략되면 기본값이 사용됩니다.

#include <iostream>
void printMessage(std::string message = "Hello, World!", int repeat = 1) {
    for (int i = 0; i < repeat; i++) {
        std::cout << message << std::endl;
    }
}

int main() {
    printMessage();               // "Hello, World!" 한 번 출력
    printMessage("Hi there");      // "Hi there" 한 번 출력
    printMessage("Greetings", 3);  // "Greetings" 세 번 출력
    return 0;
}

 

위의 예에서 message와 repeat 매개변수에 기본값을 설정했습니다. printMessage()를 호출할 때 값을 전달하지 않으면 기본값 "Hello, World!"와 1이 사용됩니다. 특정 매개변수에만 기본값을 설정할 수도 있으며, 기본값이 설정된 매개변수는 뒤에서부터 선언해야 합니다.

1. 함수 선언부에 default 값을 줄수 있다.

위 예제에서 함수 선언부에 default 값을 설정할수 있는데 예제는 아래와 같습니다.

#include <iostream>

// 함수 전방선언 : 디폴트값을 여기서 적용할수 있다.
void printMessage(std::string message = "Hello, World!", int repeat = 1);

int main() {
    printMessage();               // "Hello, World!" 한 번 출력
    printMessage("Hi there");      // "Hi there" 한 번 출력
    printMessage("Greetings", 3);  // "Greetings" 세 번 출력
    return 0;
}

void printMessage(std::string message, int repeat) {
    for (int i = 0; i < repeat; i++) {
        std::cout << message << std::endl;
    }
}

 

2. default 값은 뒤에서 부터 줘야 한다.

#include <iostream>

void printMessage(std::string message = "Hello, World!", int repeat);

int main() {
    printMessage();               // "Hello, World!" 한 번 출력
    printMessage("Hi there");      // -> 에러... default값은 뒤에서부터 줘야 한다.
    printMessage("Greetings", 3);  // "Greetings" 세 번 출력
    return 0;
}

void printMessage(std::string message, int repeat) {
    for (int i = 0; i < repeat; i++) {
        std::cout << message << std::endl;
    }
}

 

3. 함수 선언과 정의에서 기본값을 중복 설정하지 않기.

기본값은 함수 선언에서 한 번만 지정해야 하며, 정의에서 다시 지정하면 오류가 발생합니다. 일반적으로 함수의 선언부(헤더 파일)에 기본값을 지정하고, 정의부(소스 파일)에서는 기본값을 생략하는 것이 좋습니다.

// 선언부에서 기본값 지정
void example(int a, int b = 5);

// 정의부에서는 기본값 생략
void example(int a, int b) {
    // 함수 구현
}

 

4. 디폴트 값은 상수 혹은 컴파일 타임에 결정되는 값이어야 합니다.

기본값은 상수이거나 컴파일 타임에 평가될 수 있는 값이어야 합니다. 즉, 변수나 런타임에 계산되는 값을 기본값으로 사용할 수 없습니다.

int getDefault() { return 10; }

// 잘못된 예시 - 함수 호출을 기본값으로 사용하려고 시도
void example(int a = getDefault()); // 컴파일 오류 발생

 

5. 기본값이 있는 오버로드된 함수 주의

기본값이 있는 함수는 오버로딩할 때 혼란을 일으킬 수 있으므로 주의가 필요합니다. 기본값을 주지 않고 매개변수 개수가 다른 오버로드를 사용하는 것이 더 안전할 수 있습니다.

void example(int a);
void example(int a, int b = 10); // 혼란을 일으킬 수 있음

// 호출 시 어떤 함수가 호출될지 모호할 수 있음
example(5); // example(int a) 또는 example(int a, int b = 10) 호출?

 

6. 기본값이 복잡한 데이터 구조일 때 효율성 고려

기본값으로 큰 데이터 구조체나 객체를 전달할 경우 불필요한 복사 및 초기화가 발생할 수 있으므로, 기본값으로 const 참조 또는 포인터를 사용하는 것이 더 효율적일 수 있습니다.

struct Data { /* 큰 데이터 구조체 */ };

// 기본값을 값으로 전달 (비효율적)
void example(Data data = Data());

// 기본값을 const 참조로 전달 (더 효율적)
void example(const Data& data = Data());
반응형