본문 바로가기
카테고리 없음

C언어 기반의 C++(01-3) 매개변수의 디폴트 값(Default Value)

by 머리올리자 2020. 12. 19.

C++ 함수에는 '디폴트 값'이라는 것을 설정할 수 있다.

 

'디폴트 값' : 기본적으로 설정되어 있는 값

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

다음의 형태로 선언 가능

 

#include <iostream>

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

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

func1의 int num = 7의 의미는

 

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

 

따라서 다음 두 호출문은 완전히 동일

func1(); // 7이 전달된 것으로 간주!
func1(7);

 

func2도 위와 같은 방식으로 동작

 

예시

#include <iostream>

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

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

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

 

디폴트 값은 함수의 선언 부분에만 표현하면 됨

함수의 원형을 별도로 선언하는 경우, 매개변수의 디폴트 값은 함수의 원형 선언에만 위치시켜야 한다.

#include <iostream>

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

int main() {
	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;
}

함수의 선언이 별도로 필요한 경우에는 매개변수의 디폴트 값은 함수의 선언부분에만 위치시켜야 한다.

 

부분적 디폴트 값 설정

다음과 같이 정의된 함수가 있다고 가정

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){....}

 

반드시 오른쪽 매개변수의 디폴트 값을 비우는 형태로 정의해야 한다.

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

 

그렇다면 오른쪽부터 채워지는 이유는?

 

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

#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, 3] : " << boxvolume(5, 5) << std::endl;
	std::cout << "[7, 3, 3] : " << boxvolume(7) << std::endl;
	//std::cout << "[D, D, D] : " << boxvolume() << std::endl; // 컴파일 에러
}

int boxvolume(int length, int width, int height)
{
	return length * width * height;
}

참고 : [윤성우 열혈 C++ 프로그래밍] - 대부분의 내용 및 코드는 이 책에서 개인 공부 정리 목적으로 참고하였습니다.