const는 변수의 값을 상수로 만드는 키워드입니다.
예를 들어 다음의 코드는 myValue의 값을 이후 변경할 수 없습니다.
const int myValue = 500;
[변수와 상수]
변수와 상수에 대하여 배웠다면 변수는 변하는 수(variable) 상수는 변하지 않는 수(constant)라는 것을 알고 있을 겁니다. 더 정확하게는 프로그램이 실행도중에 변하는 값이 변수이고 변하지 않는 값이 상수입니다.
1,2,3 같은 리터럴 상수가 아닌 식별자(identifier)를 사용한 상수를 만들기 위해서 const 키워드를 사용합니다. 여기에는 아무 값이 담겨있지 않으니까 한번의 초기화는 허용이 됩니다. 그 후 프로그램의 실행 중에는 바뀌지 않습니다.
[포인터 변수에서 const 의 사용]
포인터 변수에서 const 를 사용하면 어떻게 될까요? 포인터의 성질도 상수처럼 바뀌게 됩니다. 그런데 일반 변수와는 사용법의 차이점이 있으니 예제를 통해서 알아보겠습니다.
1. const 키워드를 int * 의 앞에 붙입니다.
▶ 이 경우 포인터가 간접지정자로 가리키는 값을 바꿀 수 없습니다. 즉 myNum 의 값 7을 바꿀 수 없죠.
▶ ptrNum 이 가리키는 주소는 변경할 수 있습니다.
myNum 을 변경하는 것은 가능합니다. 그러나 *ptrNum 에 값을 대입하려 하면 오류가 발생합니다.
한편 ptrNum 에 다른 주소를 할당하는 것은 괜찮습니다.
2. const 키워드를 int * 의 뒤에 붙입니다.
▶ const 키워드를 int*의 뒤에 붙인다는 것은 포인터에 한번 할당한 주소를 바꿀 수 없다는 뜻입니다.
▶그러나 *ptrNum 으로 myNum의 값을 바꿀 수 있습니다.
- 주소는 바꿀 수 없고 값은 바꿀 수 있습니다. 1번 경우의 반대입니다.
포인터가 가리키는 값을 바꿉니다. myNum 도 77로 바뀝니다.
3. const 키워드를 int* 앞과 뒤에 붙입니다.
▶ 1번과 2번 둘 다에 해당합니다.
▶ 포인터가 초기화 되면 포인터에 할당된 주소와 그 주소에 저장된 값 둘다 손댈 수 없습니다.
myNum 에 저장된 값 myNum을 가리키는 주소 둘 다 변경 금지합니다.
* const 포인터를 사용하는 이유는 일반 상수를 만드는 것과 같습니다. 변하지 않아야 할 값을 프로그램 내부에서 변하지 않도록 유지하는 것이 목적입니다. 약간 번거롭게 보이지만 프로그램의 규모가 커질 수록 프로그램의 연식이 오래될 수록 빛을 발합니다.
const 포인터가 일반 상수와 다른 점은 포인터는 두개의 값을 사용할 수 있으니까 const 도 두개를 사용할 수 있습니다. 포인터가 가리키는 주소의 값을 변하지 못하게 하거나, 포인터가 가리키는 주소를 변하지 못하게 하거나, 아니면 둘 다 변경하지 못하게 하는 것도 가능합니다.
const 개념은 변수 뿐 아니라 함수와 객체로 확장되니 꼭 이해할 필요가 있습니다.
*예제코드
#include <iostream>
using namespace std;
#define Line cout <<"\n-----------------------------\n"
int main()
{
int myNum = 7;
const int* const ptrNum = &myNum;
Line;
cout << " myNum : " << myNum << endl;
cout << " ptrNum : " << *ptrNum << endl;
int* const ptrNum1 = &myNum;
*ptrNum1 = 9;
Line;
cout << " myNum : " << myNum << endl;
cout << " ptrNum1 : " << *ptrNum1 << endl;
const int* ptrNum2 = &myNum;
int newNum = 11;
ptrNum2 = &newNum;
Line;
cout << " myNum : " << myNum << endl;
cout << " newNum : " << newNum << endl;
cout << " ptrNum2 : " << *ptrNum2 << endl;
return 0;
}