본문 바로가기
스터디/C++

[ C++ ] 매개변수의 디폴트 값 ( Default Value )

by 알 수 없는 사용자 2019. 9. 5.

'디폴트 값'이란 말 그대로 '기본적으로 설정되어 있는 값'을 의미한다.

 

 

그럼, 예를 보자.

int FuncOne(int num = 7)
{
	return num+1;
}

int FuncTwo(int num1 = 5, int num2 = 7)
{
	returnn num1+num2;
}

 

FuncOne의 매개변수 선언이 다음과 같다.

int num = 7

 

그리고 이는 다음의 의미를 가진다.

"함수 호출 시 인자를 전달하지 않으면 7이 전달된 것으로 간주한다."

 

따라서 다음 두 함수 호출 문은 완전히 동일하다.

FuncOne();
FuncOne(7);

 

이어서, FuncTwo를 보면..

int num1 = 5, int num2 = 7

 

또한 이는 다음의 의미를 가진다.

"함수 호출 시 인자를 전달하지 않으면 num1에 5, num2에 7이 전달된 것으로 간주한다."

 

따라서 다음 두 함수 호출 문도 동일하게 된다.

FuncTwo();
FuncTwo(5, 7);

 

그럼 다음 예제를 살펴보자

 

C++ 매개변수의 디폴트 값

보면 순서대로 3, 7, 8가 출력된 것을 확인할 수 있다.

또한 추가적으로 다음 사실도 알 수 있다.

 

"매개변수에 디폴드 값이 설정되어 있으면, 선언된 매개변수의 수보다 적은 수의 인자 전달이 가능하다.

그리고 전달되는 인자는 왼쪽부터 채워져 나가고, 부족한 부분은 디폴트 값으로 채워진다."

 

 

그렇다면 부분적으로 디폴트 값을 설정 할 수 있지 않을까??

일단 다음과 같은 함수가 있다고 가정하자.

 

int Func(int num1, int num2, int num3) { ... }

 

이런 경우에, 다음과 같이 디폴트 값을 전부 지정할 수도 있지만..

int Func(int num1 = 3, int num2 = 5, int num3 = 7) { ... }

 

다음과 같이 일부만 디폴트 값을 지정할 수도 있다.

int Func(int num1, int num2 = 5, int num3 = 7) { ... }

 

그럼, 다음의 형태로도 함수 호출이 가능하게 된다.

Func(10); // Func(10, 5, 7)
Func(10, 20); // Func(10, 20, 7)

 

 

 

하지만, 다음과 같이 오른쪽 매개변수의 디폴트 값을 비우는 형태로는 디폴트 값을 지정할 수 없다.

int Func(int num1 = 3, int num2 = 5, int num3) { ... }

* num3은 디폴트 값이 비워져있다.

 

 

반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의해야 한다. 즉, 다음과 같은 형태는 모두 가능하다.

int Func(int num1, int num2, int num3 = 7) { ... }
int Func(int num1, int num2 = 5, int num3 = 7) { ... }
int Func(int num1 = 3, int num2 = 5, int num3 = 7) { ... }

 

반면 다음과 같은 형태는 모두 불가능하다.

int Func(int num1 = 3, int num2, int num3) { ... }
int Func(int num1 = 3, int num2 = 5, int num3) { ... }

 

 

왜 반드시 오른쪽부터 채울 것을 요구하는 이유가 무엇일까?

 

반대로 생각하면 쉽게 알 수 있다.

 

"함수에 전달되는 인자가 왼쪽에서 오른쪽으로 채워지기 때문이다."

 

다음과 같은 특성 때문에 반드시 오른쪽부터 채워야 한다.

 

 

 

 

 

 

추가로는..

 

다음과 같이 함수의 원형을 별도로 선언하는 경우,

 

C++ 매개변수의 디폴트 값

 

"매개변수의 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다."

 

이유는 쉽다. 만약에 디폴트 값의 선언이 함수의 원형에 위치하지 않는다면,

9행과 10행이 컴파일이 불가능하기 때문이다.