변수가 무엇인지는 알고 있을 것이다. 그렇다면 기본적인 매개 변수라는 뜻이
된다.
1] 디폴트 매개 변수의 의미
함수를 다음과 같은 형태로 정의하는 것이 가능하다 .
int function(int a = 0);
{
return a+1;
}
여기서 매개 변수를 선언하는 부분을 보면 a는 0으로 설정되어 있다. 이것이 바
로 디폴트 매개 변수이다. 그렇다면 이것이 지니는 의미는 무엇일까? 의외로 간
단하다. " 만약에 function이라는 이름의 함수를 호출하면서 인자를 전달하지
않으면 0이 들어 온 것으로 간주를 하겠다 " 는 뜻이다. 말 그대로 디폴트(기본
적으로 설정해 놓은) 매개 변수다.
2] 다양한 형태의 디폴트 매개 변수 설정
이번에는 디폴트 매개 변수의 다양한 형태를 예제를 통해서 살펴 보기로 하자.
다음에 소개하는 것은 직육면체의 넓이를 구하는 프로그램이다.
#include < iostream>
int BoxVolume(int length, int width = 1, int height = 1);
int main()
{
std::cout << " [3,3,3] : " << BoxVolume(3,3,3) << std::endl;
std::cout << " [5,5,def] : " << BoxVolume(5,5) << std::endl;
std::cout << " [7,def,def] : " << BoxVolume(7) << std::endl;
return 0;
}
int BoxVolume(int length, int width, int height)
{
return length*width*height;
}
함수 BoxVolume이 아랫쪽에 정의되어 있고, 위쪽에 선언되어 있다. 이러한 형
태의 구성은 이미 C 언어를 통해서 학습한 것이다. 여기서 눈 여겨 볼 부분은
함수의 선언이다. 총 세 개의 매개 변수를 인자로 전달 받는데, 두 번째, 세 번
째 인자에만 디폴트 매개 변수를 설정해 놓았다.
한가지 주의할 것은 이렇게 함수의 선언이 함수의 정의 이전에 존재하는 경우
디폴트 매개 변수는 선언 부분에 놓여져야 한다는 것이다.
3] 디폴트 매개 변수와 함수의 오버로딩
디폴트 매개 변수와 함수 오버로딩을 동시에 잘못 정의하는 경우가 있다. 다음
예제를 보자. 그리고 문제점을 지적해 보자.
#include <iostream>
int function(int a = 0)
{
return a+1;
}
int function(void)
{
return 10;
}
int main(void)
{
std::cout << function(10) << std::endl;
return 0;
}
위의 예제를 컴파일 해 보면 컴파일도 잘 되고 실행도 잘 된다. 왜냐하면 3번쨰
줄에 정의된 함수 function과 7번째 줄에 정의된 함수 function과의 관계는 오버
로딩 관계이고 main 내에서는 int형 데이터 하나를 인자로 전달 받는 함수, 즉
위쪽 함수를 호출하였으므로 문제될 것이 전혀 없다. 그러나 잠재적인 문제를
지니고 있다. 위의 예제에서 main 함수를 다음과 같이 변경한다면 어떻게 될
까?
int main(void)
{
std::cout << function() << std::endl;
return 0;
}
드디어 잠재적인 문제가 터지고 말았다. 위의 function 함수를 호출하면서 인자
를 전달하지 않고 있다. 그렇다면 어떤 함수를 호출 하겠는가? 문제를 위에서
정의한 두 함수 모두 호출 가능하다는데 있다. 컴파일러는 두 개의 함수 중에서
무엇을 호출해야 할 것인지를 결정 짓지를 못한다. 따라서 에러를 발생시켜 버
린다. 그러므로 이러한 형식의 함수 정의는 반드시 피해야 한다.
'프로그래밍 > C,C++' 카테고리의 다른 글
[C,C++] 더블버퍼링.. (0) | 2011.10.05 |
---|---|
[C,C++] 함수 오버로딩(Function Overloading) (0) | 2011.09.15 |
[C,C++] 이름공간(namespace) (0) | 2011.09.14 |
[C,C++] 인-라인(in-line) 함수 (0) | 2011.09.14 |
[C,C++] 가변 인자란 ... (0) | 2011.08.28 |