디폴트(Default)란 컴퓨터 공학에서 " 기본적인 " 이라는 의미를 지닌다. 매개

변수가 무엇인지는 알고 있을 것이다. 그렇다면 기본적인 매개 변수라는 뜻이

된다.

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
Posted by 바람처럼..
|