안녕하세요. 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 = 1, int 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(10, 20);
cout << endl << "2. addNum1(int a, int b = 99)" << endl;
// addNum2(); = error (적어도 하나의 인자가 필요)
cout << "addNum2(10) : ";
addNum2(10);
cout << "addNum2(10, 20) : ";
addNum2(10, 20);
cout << endl <<"3. addNum1(int a = 1, int b = 99)" << endl;
cout << "addNum3() : ";
addNum3();
cout << "addNum3(10) : ";
addNum3(10);
cout << "addNum3(10, 20) : ";
addNum3(10, 20);
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 = 99, string name = "BlockDMask") {}
void func3(int id, bool isStudent = true, int age = 99, string name = "BlockDMask") {}
void func3(int id = 1, bool isStudent = true, int age = 99, string name = "BlockDMask") {}
// 불가능
void func5(int id = 1, bool isStudent, int age, string name) {}
void func6(int id, bool isStudent = true, int age, string name) {}
void func7(int id, bool isStudent, int age = 44, string name) {}
void func8(int id = 3, bool isStudent, int age, string name = "BlockDMask") {}
void func9(int id, bool isStudent = true, int age, string name = "BlockDMask") {}
void func10(int id, bool isStudent, int age = 11, string name) {}
|
cs |
오늘의 포스팅 C++ 디폴트 매개변수(default parameter)는 여기까지 입니다.
오늘도 읽어주셔서 감사합니다.
'<개인공부> > [C++]' 카테고리의 다른 글
[C++] 연산자 재정의 기본 (overator overloading) (1) | 2021.05.18 |
---|---|
[C++] 람다 표현식, lambda에 대해서 (4) | 2021.05.17 |
[C++] 멤버 초기화 리스트 (member initializer lists) (0) | 2021.02.19 |
[C++] nullptr (널 포인터 리터럴) (3) | 2021.02.17 |
[C++] constexpr 상수 (0) | 2021.02.11 |
[C++] 인라인 함수 (inline function) (1) | 2021.02.10 |
[C++] 2진수 8진수 16진수 표기법, 자릿수 표기법 (0) | 2021.02.09 |
[C++] std::setw, std::setfill, std::left, std::right (입출력 형태 지정2) (0) | 2021.02.05 |