상세 컨텐츠

본문 제목

C++ const 사용.

C++/Problems

by McRobbin 2020. 9. 25. 20:02

본문

이번엔 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++ > Problems' 카테고리의 다른 글

C++ Union 데이터 타입  (0) 2020.09.26
C++ C스타일 문자열 strcpy_s, strcat_s  (0) 2020.09.25

관련글 더보기