const는 상수를 설정하는것으로 아주 얕게 알고 있었고 단순히 값이 변하지않는다는것으로 알고있었습니다.

javascript에서는 const 를 이용해서 단순히 값을 안바뀌는 변수 정도로만 생각했는데 C++ const 한정어는 여러가지의 사용방법이있는거 같습니다.


C와 C++언어에서는 포인터에대한 const 한정어가 허용됩니다. 이때 const한정어를 넣는 위치에 따라서도 의미가 달라지기도합니다.

const int a = 10;

위와 같은 문장이 있을경우 해당 문장은 저는 이렇게 해석하면 쉽게 이해가 됐습니다.

바뀌지않는 정수 a = 10;

역시 영어보단 한글이 더 직관적이죠?

C++언어에서는 변수를 선언하고 초기화하는 한문장을 만들때 데이터타입 변수명 ; 이런형식으로 선언합니다.

const 한정어는 초기화를 해주어야 합니다.물론 대입연산자 “=” 를 활용하여 해당하는 데이터타입을 선언과 동시에 할당하여 초기화를 하죠

이제 a 는 바뀌지않는 값 10을 가진 변수가 되었습니다.


여기서 조금더 어려운 개념인 const 한정어가 사용되는 포인터와 주소값의 예를 들어보겠습니다.

int a =10 , b =20;  //a,b에 각각 int형 10으로 초기화 해주었습니다.
const int *ptr = &a; // 포인터변수 ptr은 a의 주소를 가리킵니다.
*ptr = 30; // error!!
ptr = &b; // ok!!

위의 문장에서 ptr은 const int * 로 정의 되어있습니다 이는 ptr이 const int에 대한 포인터라는 의미 입니다.

비록 a가 const로 지정되지는 않았지만 ptr이 상수에 대한 포인터라고 지정했으므로 *ptr의 값을 수정하는것은 허용하지 않습니다. 하지만 주소를 변경하는 다음문장은되는게 이상하죠?

*즉, const int *ptr = &a;에서 ptr는 'const int'를 가리키는 포인터이므로, ptr을 통해 가리키는 값(ptr)은 변경할 수 없습니다. 그래서 *ptr = 30;은 오류를 발생시킵니다.

그러나 ptr 자체, 즉 ptr가 가리키는 주소는 const로 지정되지 않았습니다. 따라서 ptr는 다른 주소를 가리킬 수 있습니다. 그래서 ptr = &b;는 허용됩니다.

주소를 변경하는것을 막으려면 const 의 위치를 바꾸어 줘야 합니다.

int a =10 , b =20;  //a,b에 각각 int형 10으로 초기화 해주었습니다.
 int * const ptr = &a; // 포인터변수 ptr은 a의 주소를 가리킵니다.
*ptr = 30; // ok!!
ptr = &b; // error!!

const 한정어 const int *ptr 이 경우, ptr은 const int를 가리키는 포인터입니다. 따라서 ptr을 통해 가리키는 값(*ptr)은 변경할 수 없습니다. 그러나 ptr 자체, 즉 ptr이 가리키는 주소는 변경 가능합니다.int * const ptr: 이 경우, ptr은 const 포인터입니다. 즉, ptr이 가리키는 주소 자체가 변경할 수 없습니다. 그러나 ptr을 통해 가리키는 값(*ptr)은 변경 가능합니다.

const int *ptr = &a;  // 값을 변경할수없음
int * const ptr = &b; // 주소를 변경할수없음

const한정어의 위치에따라 포인터는 다르게 작동하는것을 반드시 알고 넘어 가야 할것 같습니다.

저또한 공부를 하는입장이지만 이렇게 글을 남김으로써 더욱 이해가 잘되고 다음에 다시 볼때도 편하겠네요

+ Recent posts