이번엔 const를 정리해 보겠습니다. 코딩할때 중요하게 쓰이는 부분입니다.
1. 포인터가 아닌 변수 앞에 const 키워드
포인터가 아닌 변수 앞에 const를 쓰면 해당 변수를 상수 처럼 쓸 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <iostream>
using namespace std;
int main()
{
// 상수 num을 10으로 초기화.
const int num = 10;
// 불가능.
num = 20;
// 불가능.
const int num2;
}
|
이처럼 쓸 수 있는데 한번 정의한 num을 다시 변경할 수 없고,
num2를 선언과 동시에 정의하지 않으면 안됩니다.
num은 프로그램이 끝날때 까지 10의 값만 가지고 있습니다.
2. 포인터 앞에 const 키워드.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>
using namespace std;
int main()
{
int num1 = 10;
int num2 = 20;
const int* pNum1 = &num1;
// 출력 결과 : 10
cout << *pNum1 << endl;
pNum1 = &num2;
// 출력 결과 : 20
cout << *pNum1 << endl;
}
|
하지만 포인터의 경우 (레퍼런스 또한 마찬가지) 이런식으로 값을 바꿔줄수 있습니다.
좀 더 명확하게는 pNum1이 처음 num1을 가리키고 있고 후에 num2를 가리키도록
바꿀 수 있습니다.
그럼 const는 왜 붙이냐? 바로 가리키는 주소 안의 값을 바꿀 수 없기 때문입니다.
pNum1이 가리키는 num1의 주소, 그 안에 들어있는 10의 값을 바꿀 수 없습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#include <iostream>
using namespace std;
int main()
{
int num1 = 10;
int num2 = 20;
const int* pNum1 = &num1;
// 출력 결과 : 10
cout << *pNum1 << endl;
pNum1 = &num2;
// 출력 결과 : 20
cout << *pNum1 << endl;
// 불가능.
*pNum1 = 30;
}
|
cs |
이런식으로 안에 있는 값을 바꿀 수가 없게 됩니다.
그럼 이것을 언제 써먹느냐?
함수의 매개 변수로 넘겨줄 때 많이 씁니다!!!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
using namespace std;
int sum(int num1, int num2)
{
return num1 + num2;
}
int pSum(const int* num1, const int* num2)
{
return *num1 + *num2;
}
int rSum(const int& num1, const int& num2)
{
return num1 + num2;
}
|
3개의 함수를 만들었습니다. 3개 모두 두 수의 합을 리턴하는 함수 입니다.
사용 이유 1.
const int* 는 해당 주소 안의 값을 바꿀 수 없습니다.
단순히 값으로 넘겨주면 메모리에 값의 복사가 일어나는데 그 자체로 효율이 떨어집니다.
그래서 주소로 값을 넘겨받는 대신, 주소로 받으면 값을 바꿔버릴 수 있으니
그 값을 바꾸지 않겠다고 보장해 주는 것입니다!!
레퍼런스 또한 마찬가지 입니다. 내부적으로는 포인터로 되어있으므로 사용법은 같습니다.
사용 이유 2.
const int& 의 경우에는 매개변수로 상수를 받을 수 없습니다!
rSum함수를 사용할 때 rSum(10, 20); 이런식으로 사용할 수 없죠.
int num1 = 10, num2 = 20;
rSum(num1, num2); 이런식으로 넘겨줘야 합니다.
const int& 를 사용하면 이제 상수의 값도 넘겨줄 수 있습니다.
3. 포인터 뒤에 const 키워드.
3번이 1번의 사용법과 유사한 포인터의 상수화 입니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <iostream>
using namespace std;
int main()
{
int num1 = 10;
int num2 = 20;
int* const pNum1 = &num1;
int* const pNum2 = &num2;
// 불가능. 초기화 되지 않음.
int* const pNum3;
// 불가능. 가리키는 대상을 바꿀 수 없음.
pNum1 = &num2;
}
|
pNum3을 선언하고 초기화 하지 않으면 사용할 수 없습니다.
pNum1이 처음 선언되고 num1의 주소를 가지고 있었는데,
다시 num2를 가리키도록 할 수 없습니다.
C++ Union 데이터 타입 (0) | 2020.09.26 |
---|---|
C++ C스타일 문자열 strcpy_s, strcat_s (0) | 2020.09.25 |