본문 바로가기
Object Oriented Programming(C++)/열혈 C++ 프로그래밍

C++ | 01-3 매개 변수의 디폴트 값(Default Value)

by continue96 2021. 7. 24.

 

1. 매개 변수의 디폴트 값(Default Value)

1.1 디폴트 값의 이해

 C++는 함수를 선언할 때 매개 변수에 기본 값을 지정하여 선언할 수 있다. 이것을 디폴트 매개 변수라고 하며. 디폴트 매개 변수가 선언된 함수를 호출할 때 사용자가 매개 변수에 인자를 전달하면 전달된 인자를 사용한다. 그러나 이 함수를 호출할 때 사용자가 인자를 전달하지 않으면, 미리 지정해놓은 기본 값을 매개 변수의 인자로 대신 전달한다.

 

DefaultValue.cpp
#include <iostream>

int Add(int num1 = 1, int num2 = 2);	// 매개 변수 num1과 num2에 각각 디폴트 값 1, 2를 지정한다.

int main(void) {
	std::cout << Add() << std::endl;		// Add(1, 2)와 같다.
	std::cout << Add(5) << std::endl;	// Add(5, 2)와 같다.
	std::cout << Add(3, 5) << std::endl;
	return 0;
}

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

 

DefaultValue.cpp 실행 결과
3
7
8

 6행의 Add 함수를 호출할 때, 매개 변수 num1과 num2의 인자를 제공하지 않았으므로 이 Add 함수는 기본 값인 1과 2를 인자로 대신 전달한다. 7행의 Add 함수는 매개 변수 num1에 5를 전달했지만, num2에는 아무것도 전달하지 않았으므로 num2의 기본 값인 2를 인자로 대신 전달한다. 8행의 Add 함수는 매개 변수 num1과 num2에 모두 인자를 직접 전달하였고, 이러한 경우에 매개 변수의 디폴트 값은 아무런 의미를 갖지 않는다.

 

[한줄 요약] 디폴트 매개 변수란?
함수 선언에서 매개 변수에 기본 값을 지정하는 것으로, 매개 변수에 인자를 전달하지 않으면 기본 값을 전달한다.

 

1.2 부분적 디폴트 값

 함수의 매개 변수에 디폴트 값을 지정할 때 모든 매개 변수에 디폴트 값을 지정할 수도 있지만, 일부 매개 변수에 지정할 수도 있다. 부분적으로 디폴트 값을 지정하려면 반드시 오른쪽 매개 변수부터 채우는 형식으로 정의해야 한다.

 

int defaultFunction(int num1 = 1, int num2 = 2, int num3 = 3) {...}	
int defaultFunction(int num1, int num2 = 2, int num3 = 3) {...}		
int defaultFunction(int num1, int num2, int num3 = 3) {...}		// 이것은 유효한 함수 정의입니다.

int defaultFunction(int num1 = 1, int num2, int num3) {...}	
int defaultFunction(int num1 = 1, int num2 = 2, int num3) {...}		// 이것은 유효하지 않은 함수 정의입니다.

 그렇다면 반드시 오른쪽 매개 변수부터 채워야 하는 이유가 무엇일까? 5행의 defaultFunction 함수를 살펴보면 그 이유를 알 수 있다. 첫 번째 매개 변수 num1에 1이 기본 값으로 지정있는데, 이 디폴트 값이 의미를 가지려면 함수를 호출할 때 매개 변수 num2와 num3에 인자를 전달할 수 있어야 한다. 그런데 함수에 전달되는 인자는 왼쪽에서 오른쪽으로 채워지기 때문에 이것이 불가능하다. 따라서 이러한 부분적 디폴트 값의 정의는 허용하지 않는다.

 

[한줄 요약] 디폴트 값의 선언
매개 변수에 디폴트 값은 오른쪽 매개 변수부터 채우는 형식으로 정의한다.

2. 매개 변수의 디폴트 값 문제 풀이

 

열혈 C++ 프로그래밍 | 문제 01-3 | 매개변수의 디폴트 값

문제 1 예제 DefaultValue3.cpp에 정의된 함수 BoxVolume을 '매개변수의 디폴트 값 지정' 형태가 아닌, '함수 오버로딩'의 형재로 재구현해보자. 물론 main 함수는 변경하지 않아야 하며 실행 결과도 동일

continue96.tistory.com

 

댓글