[01-3] 매개변수의 디폴트 값 (Default Value)

김민성·2022년 7월 10일
post-thumbnail

C++함수에는 '디폴트 값'이라는 것을 설정할 수 있다.
여기서 말하는 '디폴트 값'이란 '기본적으로 설정되어 있는 값'을 의미한다.

매개변수에 설정하는 '디폴트 값'의 의미

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

int MyFuncTwo(int num1=5, int num2=7) {
	return num1+num2;
}

MyFuncOne의 매개변수 선언은

int num=7

이며,

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

는 의미를 지닌다.

MyFuncTwo의 매개변수 선언은

int num1=5, int num2=7

이며,

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

는 의미를 지닌다.

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

MyFuncTwo();
MyFuncTwo(5, 7);

두 함수 모두 5와 7이 전달되는 것이다.

앞의 내용을 바탕으로 한 다음의 예제를 통해, 매개변수에 디폴트 값을 지정한 결과를 확인해보면 되겠다.

DefaultValue1.cpp

#include <iostream>

int Adder(int num1=1, int num2=2) {
    return num1+num2;
}

int main(void) {
    std::cout<<Adder()<<std::endl;
    std::cout<<Adder(5)<<std::endl;
    std::cout<<Adder(3, 5)<<std::endl;
    return 0;
}
3
7
8

Adder()는 1, 2가 전달된 것으로 간주되고,
Adder(5)는 5, 2가 전달 된 것으로,
Adder(3, 5)는 3, 5가 전달 된 것이다.

어? Adder(5)를 통해 다음과 같은 사실도 알 수 있다!

매개변수에 디폴트 값이 설정되어 있으면, 
선언된 매개변수의 수보다 적은 수의 인자전달이 가능하다. 
그리고 전달되는 인자는 왼쪽에서부터 채워져 나가고, 부족분은 디폴트 값으로 채워진다.

디폴트 값은 함수의 선언 부분에만 표현하면 됩니다.

매개변수의 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다. 다시 말해 함수의 정의 부분에는 위치시킬 수 없는 것이다.

DefaultValue2.cpp

#include <iostream>
int Adder(int num1=1, int num2=2);

int main(void){
    std::cout<<Adder()<<std::endl;
    std::cout<<Adder(5)<<std::endl;
    std::cout<<Adder(3, 5)<<std::endl;
    return 0;
}

int Adder(int num1, int num2) {
    return num1+num2;
}
3
7
8

여기서 2행에 해당하는 이 부분은

int Adder(int num1=1, int num2=2);

함수의 선언이고, 12행~14행에 해당하는 이 부분은

int Adder(int num1, int num2) {
    return num1+num2;
}

함수의 정의이다.

부분적 디폴트 값 설정

디폴트 값을 일부분만 지정할 수 있다.
하지만 오른쪽 매개변수의 디폴트 값을 비우는 형태로는 절대 지정할 수 없다.
반드시 오른쪽 매개변수의 디폴트 값부터 채우는 형태로 정의 해야 한다.

int YourFunc(int num1, int num2, int num3=30) {. . .}
int YourFunc(int num1, int num2=20, int num3=30) {. . .}
int YourFunc(int num1=10, int num2=20, int num3=30) {. . .}

위와 같은 함수정의는 모두 가능하다!
하지만 아래와 같은 함수정의는 불가능하다.

int YourFunc(int num1=10, int num2, int num3) {. . .}
int YourFunc(int num1=10, int num2=20, int num3) {. . .}

그 이유가 무엇일까? 바로..

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

다음의 예제를 보면서 이해해보자.

DefaultValue3.cpp

#include <iostream>

int BoxVolume(int length, int width=1, int height=1);

int main(void) {
    std::cout<<"[3, 3, 3] : "<<BoxVolume(3, 3, 3)<<std::endl;
    std::cout<<"[5, 5, D] : "<<BoxVolume(5, 5)<<std::endl;
    std::cout<<"[5, D, D] : "<<BoxVolume(5)<<std::endl;
    //std::cout<<"[D, D, D] : "<<BoxVolume()<<std::endl;
    return 0;
}

int BoxVolume (int length, int width, int height) {
    return length*width*height;
}
[3, 3, 3] : 27
[5, 5, D] : 25
[5, D, D] : 5

BoxVolume 함수 같은 경우는 첫 번째 매개변수에 디폴트 값이 지정되지 않았기 때문에, 반드시 하나 이상의 인자를 전달하도록 함수를 호출해야한다.

std::cout<<"[D, D, D] : "<<BoxVolume()<<std::endl; 

이 행과 같은 경우는 모든 매개변수에 디폴트 값이 지정되지 않았기 때문에, 첫번째 인자에 값이 비게 된다. 따라서 이는 컴파일 에러로 이어진다.

profile
다양한 활동을 통해 인사이트를 얻는 것을 즐깁니다. 저 또한 인사이트를 주는 사람이 되고자 합니다.

0개의 댓글