C++

C++ 디폴트 인수(Default Arguments) 총정리

김구티2 2024. 4. 2. 18:59

1. 디폴트 인수의 개념

디폴트 인수는 함수 선언에서 제공되는 값으로, 호출 함수가 인수에 대한 값을 제공하지 않으면 컴파일러가 자동으로 할당한다. 이때 어떤 값이 전달되면 디폴트 값은 덮어쓴다.

 

예시를 통해 확인해 본다. 여기서 우리는 3개의 합 함수를 쓸 필요가 없다. 3번째 인수와 4번째 인수의 디폴트 값을 사용하면 하나의 함수만 작동한다.


// CPP Program to demonstrate Default Arguments
#include <iostream>
using namespace std;

// A function with default arguments,
// it can be called with
// 2 arguments or 3 arguments or 4 arguments.
int sum(int x, int y, int z = 0, int w = 0) //assigning default values to z,w as 0
{
     return (x + y + z + w);
}

// Driver Code
int main()
{
     // Statement 1
     cout << sum(10, 15) << endl;

     // Statement 2
     cout << sum(10, 15, 25) << endl;

     // Statement 3
     cout << sum(10, 15, 25, 30) << endl;
     return 0;
}

출력:

25

50

80

 

Statement 1에서 두 개의 값만 통과되므로 변수 z와 w는 디폴트 값인 0을 받는다. Statement 2에서는 세 개의 값이 통과되므로 z의 값은 25로 오버라이딩된다. Statement 3에서는 네 개의 값이 통과되므로 z와 w의 값은 각각 25와 30으로 오버라이딩된다.

 

디폴트 인수를 포함하여 함수 오버로딩이 이루어지면 컴파일러가 모호하지 않은지 확인해야 한다. 그렇지 않으면 오류가 발생할 수 있기 때문이다. 위 프로그램을 수정한 버전은 다음과 같다.

 

// CPP Program to demonstrate Function overloading in
// Default Arguments
#include <iostream>
using namespace std;

// A function with default arguments, it can be called with
// 2 arguments or 3 arguments or 4 arguments.
int sum(int x, int y, int z = 0, int w = 0)
{
     return (x + y + z + w);
}
int sum(int x, int y, float z = 0, float w = 0)
{
     return (x + y + z + w);
}
// Driver Code
int main()
{
     cout << sum(10, 15) << endl;
     cout << sum(10, 15, 25) << endl;
     cout << sum(10, 15, 25, 30) << endl;
     return 0;
}

 

위 프로그램을 출력하면 그야말로 오류의 향연이 펼쳐진다. 

 

생성자는 디폴트 매개변수도 포함할 수 있다. 디폴트 생성자는 매개변수가 없거나 디폴트 인수가 있는 매개변수를 가질 수도 있다.

 

예시:

// CPP code to demonstrate use of default arguments in
// Constructors

#include <iostream>
using namespace std;

class A {
     private:
          int var = 0;
     public:
          A(int x = 0): var(x){}; // default constructor with one argument
                                           // Note that var(x) is the syntax in c++ to do : "var = x"
          void setVar(int s){
               var = s; // OR => this->var = s;
               return;
          }
          int getVar(){
               return var; // OR => return this->var;
          }
};
int main(){
     A a(1);

     a.setVar(2);

     cout << "var = " << a.getVar() << endl;

     /* ANOTHER APPROACH:
     A *a = new A(1);

     a->setVar(2);

     cout << "var = " << a->getVar() << endl;
     */
}

// contributed by Francisco Vargas #pt

 

여기서는 인수가 없는 디폴트 생성자와 디폴트 인수가 하나인 디폴트 생성자를 볼 수 있다. 인수가 있는 디폴트 생성자는 값이 0으로 할당된 디폴트 매개 변수 x를 가지고 있다.

 

· 디폴트 인수는 상수 인수를 변경할 수 없기 때문에 상수 인수와 다르며, 디폴트 인수는 필요한 경우 덮어쓸 수 있다.
· 디폴트 인수는 호출 함수에서 값을 제공할 때 덮어쓴다. 예를 들어 함수 합(10, 15, 25, 30)을 호출하면 z와 w의 값을 각각 25와 30으로 덮어쓰는 것이다.
· 함수가 호출되면 인수는 호출 함수에서 호출 함수로 왼쪽에서 오른쪽 순서로 복사된다. 따라서 sum(10, 15, 25)은 x, y, z에 각각 10, 15, 25를 할당하므로 디폴트 값인 w만 사용된다.
· 함수 정의의 인수에 디폴트 값이 사용되면 그 인수에 대한 모든 후속 인수도 디폴트 값을 가져야 한다. 또한 디폴트 인수가 오른쪽에서 왼쪽으로 할당되었다고 말할 수 있다. 예를 들어, 아래의 함수 정의는 디폴트 변수 z의 후속 인수가 디폴트 값이 아니므로 유효하지 않다.

// Invalid because z has default value, but w after it doesn't have a default value
int sum(int x, int y, int z = 0, int w).

2. 디폴트 인수의 장단점

장점으로는,

① 디폴트 인수는 함수에 다른 디폴트 인수를 추가하는 것만으로 수행할 수 있으므로 기존 함수의 기능을 높이고자 할 때 유용하다.
② 프로그램 크기를 줄이는 데 도움이 된다.
③ 간단하고 효과적인 프로그래밍 접근 방식을 제공한다.
④ 디폴트 인수는 프로그램의 일관성을 향상시킨다.

 

단점으로는,

컴파일러가 생략된 인수를 함수 호출의 기본값으로 대체해야 하므로 실행 시간이 늘어난다.

728x90

'C++' 카테고리의 다른 글

C++ 인라인(Inline) 함수 총정리  (0) 2024.04.04
C++ 재귀(Recursion) 총정리  (1) 2024.04.03
C++ Call by Value와 Call by Reference의 차이  (0) 2024.04.01
C++ 매개변수 전달 총정리  (0) 2024.03.30
C++ return문 총정리  (0) 2024.03.17