<개인공부>/[C++]

[C++] 디폴트 매개변수 (default parameter)

BlockDMask 2021. 2. 15. 00:30
반응형

안녕하세요. BlockDMask입니다.
오늘은 C++의 편리한 문법 디폴트 매개변수, 디폴트 파라미터, default paramter에 대해서 알아보려고 합니다.

 

<목차>
1. default parameter 정리
2. default parameter 주의할 점

 

 

 

1. C++ 디폴트 매개변수, 디폴트 파라미터란?


 

- 디폴트 매개변수?

한 문장으로 정리를 하면

함수 호출 시 인자를 넣지 않으면, "미리 정해준 인자 값"이 대신 들어가게 됩니다.

아 물론. 반대로, 인자로 값을 넣게 되면 "미리 정해둔 인자 값"이 아니라 지금 넣는 인자가 들어가게 됩니다.

디폴트 매개변수는 함수의 인자에 "= 값" 을 사용해서 값을 정해줄 수 있습니다.
들어온 숫자를 더해서 출력하는 함수 void addNum(int a, int b)가 있다고 가정하면
디폴트 매개변수는 void addNum(int a, int b = 10) 이런 식으로 두 번째로 들어오는 인자의 디폴트 값을 지정해줄 수 있습니다.
물론  void addNum(int a = 20, int b = 10) 이렇게 두 인자 모두 디폴트 값을 지정해 줄 수 있습니다.
바로 예제로 확인해볼까요?

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include<iostream>
#include<string>
using namespace std;
 
void addNum1(int a, int b)
{
    cout << a << " + " << b << " = " << a + b << endl;
}
 
void addNum2(int a, int b = 99)
{
    cout << a << " + " << b << " = " << a + b << endl;
}
 
void addNum3(int a = 1int b = 99)
{
    cout << a << " + " << b << " = " << a + b << endl;
}
 
 
int main(void) {
    cout << "1. addNum1(int a, int b)" << endl;
    // addNum1();        = error (두 인자 모두 필요)
    // addNum1(10);     = error (두 인자 모두 필요)
 
    cout << "addNum1(10, 20) : ";
    addNum1(1020);
 
 
 
 
    cout << endl << "2. addNum1(int a, int b = 99)" << endl;
    // addNum2();        = error (적어도 하나의 인자가 필요)
 
    cout << "addNum2(10) : ";
    addNum2(10);
 
    cout << "addNum2(10, 20) : ";
    addNum2(1020);
 
 
 
 
    cout << endl <<"3. addNum1(int a = 1, int b = 99)" << endl;
    cout << "addNum3() : ";
    addNum3();
 
    cout << "addNum3(10) : ";
    addNum3(10);
 
    cout << "addNum3(10, 20) : ";
    addNum3(1020);
 
    return 0;
}
 
cs

디폴트 파라미터 예제

addNum1(int a, int b)
- 이것은 우리가 흔히 아는 함수 인자의 모습입니다. 우리는 이런 함수를 호출할 때 addNum1(값1, 값2) 이렇게 인자의 값을 넣어주어야 합니다.

addNum2(int a, int b = 99)
- 두 번째 인자 b가 디폴트 매개변수가 되어서 디폴트 값이 세팅되어있는 것을 알 수 있습니다.
- 이것은 b의 인자를 사용자가 값을 넣지 않게 되면 b에 99를 넣어서 함수를 진행하겠다는 이야기입니다.
- addNum2(값1, 값2); 를 넣게되면 값1, 값 2가 들어가게 되고
- addNum2(값1);  이렇게 호출하게 되면 값1은 a변수로 들어가게 되고, b변수는 디폴트 값인 99로 들어가게 됩니다.

addNum3(int a = 1, int b = 99)
- 첫 번째 두 번째 인자 모두 디폴트 값이 있는 것을 볼 수 있습니다.
- addNum3(); 이런 식으로 두 매개변수에 아무 값도 넣지 않았을 때 a는 1이 되고, b는 99가 되어 함수를 수행하게 됩니다.
- addNum3(10); 이렇게 되면 a에는 10, b는 99가 들어가게 됩니다.
- addNum3(10, 20); 이렇게 되면 a에는 10, b는 20이 들어가게 됩니다.

어떤가요? 디폴트 매개변수는 이렇게 값을 넣지 않아도 디폴트 값으로 세팅되어서 함수를 수행할 수 있는 유용한 기능입니다.

물론 문자열도 당연히 가능하겠죠?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include<iostream>
#include<string>
using namespace std;
 
void printName(string name = "kim")
{
    cout << "name : " << name << endl;
}
 
 
int main(void) {
 
    // 사용자가 넣은 인자값
    printName("BlockDMask");
 
    // 디폴트 인자값
    printName();
 
    return 0;
}
 
cs

디폴트 매개변수 예제

printName("문자열") 일 때 문자열을 생략하면 디폴트 값으로 세팅되어있는 "kim"이 출력되고 있는 것을 볼 수 있습니다.
값을 넣어주게 되면 넣은 값이 name 변수에 들어가는 것을 볼 수 있습니다.

 

 

2. C++ 디폴트 파라미터 주의할 점


디폴트 파라미터를 사용할 때 주의할 점이 두 가지가 있습니다.
1) 디폴트 값을 지정해줄 때는 뒤에서부터 지정한다.
2) 중간에 비어있는 게 있으면 절대 안 된다.

이 두 가지의 규칙을 꼭 지켜야 합니다.

만약 디폴트 값을 앞에서 지정하거나, 중간에 비어있는 게 있다면 어느 인자를 생략하고, 어느 인자에 값을 넣는지 알 수 없기 때문입니다.

void addNum(int a = 10, int b); 만약 이게 가능하다고 한다면,
addNum(100)에서 100의 값이 a를 가리키는지 b를 가리키는지 혼동이 올 수 있습니다.
왜냐하면 인자의 순서상 첫 번째로 들어간 것은 첫 번째와 짝꿍이 되어야 한다는 규칙이 있기 때문입니다.

void addNum(int a = 10, int b, int c =30, int d); 이것도 가능하다고 한다면
addNum(20) 이게 첫번째 인자인지, 두 번째 인자로 들어갈지 판단하기 어려우며
addNum(20, 40) 이게 디폴트 인자가 있는 a에 20을 넣겠다는 건지 b에 20을 넣겠다는 건지 혼동이 오기 때문입니다.

정리를 해보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
// 가능
void func1(int id, bool isStudent, int age, string name = "BlockDMask") {}
void func2(int id, bool isStudent, int age = 99string name = "BlockDMask") {}
void func3(int id, bool isStudent = trueint age = 99string name = "BlockDMask") {}
void func3(int id = 1bool isStudent = trueint age = 99string name = "BlockDMask") {}
 
// 불가능
void func5(int id = 1bool isStudent, int age, string name) {}
void func6(int id, bool isStudent = trueint age, string name) {}
void func7(int id, bool isStudent, int age = 44string name) {}
void func8(int id = 3bool isStudent, int age, string name = "BlockDMask") {}
void func9(int id, bool isStudent = trueint age, string name = "BlockDMask") {}
void func10(int id, bool isStudent, int age = 11string name) {}
cs

 

 

오늘의 포스팅 C++ 디폴트 매개변수(default parameter)는 여기까지 입니다.
오늘도 읽어주셔서 감사합니다.

반응형