디폴트 매개변수
- 함수의 매개변수에 초깃값을 기술 할 수 있다.
int TestFunc(int nParam=10){ //디폴트 매개변수 사용. TestFunc(), TestFunc(12) 둘다 호출가능
return nParam;
}
- 매개변수의 디폴트 값을 선언한 함수는 호출자 코드에서 실인수를 생략한 채 호출할 수 있다.
- 이러한 특성 때문에 C++에서는 절대로 호출자의 코드만 보고 함수 원형을 확정하면 안된다!
- 호출할 때 함수 매개변수의 왼쪽부터 짝을 맞춘다. 짝이 맞지 않으면 매개변수의 디폴트값을 적용한다.
- 디폴트 매개변수는 반드시 오른쪽 매개변수부터 기술해야한다. 디폴트 매개변수 사이에 디폴트 매개변수가 아닌 것이 있을 수 없다.
사용 예
#include "stdafx.h"
#include <iostream>
int TestFunc(int nParam1, int nParam2 = 2){
return nParam1 * nParam2;
}
int main(){
std::cout << TestFunc(10) << std::endl; // nParam1에 10
std::cout << TestFunc(10,5) << std::endl; // nParam1에 10, nParam2에 5 대입
}
디폴트 매개변수를 사용하는 일은 자제하는 것이 좋다.
- 호출자 코드만 봐서는 함수 원형을 알아내기란 불가능해, 모호성이 있기 때문
- 디폴트 매개변수를 사용하는 것이 좋을 때도 있긴하다. "함수를 만든 사람(A)과 사용자(B)가 서로 다를경우"
디폴트 매개변수를 사용하는 것이 좋은 경우
1. A가 TestFun(int a, int b)를 만들어서 A코드에서 TestFun(10,5)를 호출했다.
2. 나중에 B가 TestFun함수에 값 하나를 더 넘기고 싶어서 함수에 매개변수 c를 추가했다.
TestFun(int a, int b, int c)로 함수를 수정하고 B는 자신의 코드에서 TestFun(10, 5, 100)을 호출했다.
3. 여기서 문제가 발생했다. A의 코드에서 잘돌아가던 TestFun(10, 5)가 오류가 발생하게 된다.
4. 해결방법은 A의 코드에서 오류가 나지 않게 하기 위해서는 디폴트 매개변수를 사용하는 것이다. 그래서 B는 세번째 매개변수에 디폴트 값을 설정한 후 세개의 매개변수를 사용하기로 했다.
B가 수정한 코드 : int TestFun(int a, int b, int c = 100)
5. 함수를 만든 A도 원래 코드인 TestFun(10,5)로 사용할 수 있게 되었다.
위 예제는 디폴트 매개변수를 사용하여 현재(B의 코드)와 과거(A의 코드) 모두에 적합한 함수 원형이 될 수 있게 되었다. 이와 같은 경우를 제외하고 디폴트 매개변수를 사용하는 일은 신중해야한다.
개발자 유의 사항
실력있는 개발자는 '미래'의 유지보수 문제에 대응할 수 있도록 '현재'코드를 작성할 줄 알아야한다.
C++같은 객체지향 언어는 '객체'라는 대상에 한 제작자(혹은 작성자)와 사용자가 다른 사람인 경우가 많으므로 실제 함수를 사용할 사용자를 고려해 코드를 작성하는 습관을 갖는 것이 중요하다.
'◼️C++' 카테고리의 다른 글
[C++] 인라인 함수 (0) | 2023.09.05 |
---|---|
[C++] 함수다중정의(오버로딩), 템플릿 함수 (0) | 2023.09.05 |
[C++] 소숫점 아랫자리 버리기. 정확하지 않은 실수 연산 해결하기 (0) | 2023.09.04 |
[C++] 범위 기반 for 문 for(auto n : nList) (0) | 2023.08.31 |
[C++] 참조자 형식 int &n = a; (0) | 2023.08.31 |