소년코딩

디폴트 매개 변수 (default parameter)

디폴트 매개 변수(default parameter)는 기본값이 제공된 함수 매개 변수다. 사용자가 이 매개 변수의 값을 제공하지 않으면 기본값(default value)이 사용된다. 반대로 매개 변수의 값을 제공하면 사용자 제공 값이 기본값 대신 사용된다.

void printValues(int x, int y=10)
{
    std::cout << "x: " << x << '\n';
    std::cout << "y: " << y << '\n';
}

int main()
{
    printValues(1);    // y will use default parameter of 10
    printValues(3, 4); // y will use user-supplied value 4
}
/*
x: 1
y: 10
x: 3
y: 4
*/

첫 번째 함수 호출(printValues(1))에서 호출자는 y에 대한 인수를 제공하지 않으므로 함수는 기본값 10을 사용한다. 두 번째 호출(printValues(3, 4))에서 호출자는 y 값을 제공했으므로 사용자 제공 값이 사용되었다.

디폴트 매개 변수(default parameter)가 있는 함수는 사용자가 무시할 수도 있고 그렇지 않을 수도 있으므로 훌륭한 옵션이다. 예를 들어, 다음 예제는 default parameter를 사용하는 몇 가지 함수 원형(prototype)이다.

void openLogFile(std::string filename="default.log");
int rollDie(int sides=6);
void printStringInColor(std::string str, Color color=COLOR_BLACK); // Color is an enum

Multiple default parameters

함수는 디폴트 매개 변수(default parameter)를 여러 개 가질 수 있다.

void printValues(int x=10, int y=20, int z=30)
{
    std::cout << "Values: " << x << " " << y << " " << z << '\n';
}

함수를 호출해보자.

printValues(1, 2, 3);
printValues(1, 2);
printValues(1);
printValues();
/*
Values: 1 2 3
Values: 1 2 30
Values: 1 20 30
Values: 10 20 30
*/

매개 변수 xy에 대한 인수를 제공하지 않고는 매개 변수 z에 인수를 제공할 수 없다. C++가 printValues(, , 3)과 같은 호출 구문을 지원하지 않기 때문이다. 이는 다음과 같은 규칙 때문이다.

모든 default parameter는 오른쪽부터 지정해야 한다. 그래서 다음은 허용되지 않는다.

void printValue(int x=10, int y); // not allowed

Default parameters can only be declared once

선언된 후에는 디폴트 매개 변수(default parameter)를 다시 선언할 수 없다. 즉, 전방 선언과 함수 정의가 있는 함수의 경우, default parameter는 전방 선언이나 함수 정의 둘 중 하나에서만 선언할 수 있다.

void printValues(int x, int y=10);

void printValues(int x, int y=10) // error: redefinition of default parameter
{
    std::cout << "x: " << x << '\n';
    std::cout << "y: " << y << '\n';
}

가장 좋은 방법은 전방 선언이 다른 헤더 파일에 있는 경우 함수 정의가 아닌 전방 선언에서 default parameter를 선언하는 것이다.

foo.h:
#ifndef FOO_H
#define FOO_H
void printValues(int x, int y=10);
#endif
main.cpp:
#include "foo.h"
#include <iostream>

void printValues(int x, int y)
{
    std::cout << "x: " << x << '\n';
    std::cout << "y: " << y << '\n';
}

int main()
{
    printValues(5);

    return 0;
}

위의 예제 main.cpp의 #include "foo.h"는 default parameter를 정의하는 전방 선언을 하고 있기 때문에 printValues() 함수를 가지고 있으므로 main.cpp의 printValues() 함수 정의에서는 default parameter를 사용할 수 없다.


Default parameters and function overloading

디폴트 파라미터(default parameter)가 있는 함수를 오버로딩(overloading)할 수 있다. 예를 들어, 다음 예제를 보자.

void print(std::string string);
void print(char ch=' ');

사용자가 print()를 호출하면 print(' ')가 호출되어 스페이스를 출력한다.

그러나 다음은 허용하지 않는다.

void printValues(int x);
void printValues(int x, int y=20);

호출한 사람이 printValues(10)을 호출하면 컴파일러는 사용자가 printValues(int)인지 printValues(int, 20)지 여부를 명확히 할 수 없다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/77-default-parameters/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기