[c++] const와 volatile 키워드

Yoo Hyung Joo ·2023년 12월 9일
0

const

const는 상수라는 의미를 가지고 있는 키워드다. const로 변수를 선언하게 되면 프로그램이 실행되는 동안 메모리에 저장된 데이터를 변경할 수 없다.

ex)

const int key = 10;
key = 12; //컴파일 오류

이러한 방식으로 const는 변수 선언을 했을 때 막아주는 역할을 한다. 또한 const는 선언과 동시에 초기화를 해주어야 사용을 할 수 있다.

여기서 궁금한 점은 const는 정말로 수정할 수 없을까? 라는 의문이 생기기도 한다.

c++은 주소를 통해 값에 접근할 수 있으니까 주소를 통해는 값을 바꿀 수 있을 것 같기도 하다.
그럼 과연 이런 방법으로는 const 값을 수정할 수 있을까?
ex)

const int cnt = 0;
int* pPtr = (int*)&cnt;
*pPtr = 1111;

std::cout << cnt;

이 방식으로 const의 주소를 가져와서 값을 바꾸게 되면 값을 수정할 수 있을까?

정답은 X 이다.

volatile

volatile은 정의로는 컴파일러의 최적화(optimization) 막아준다. 이다. 이 키워드는 또 언어마다 컴파일 방식도 다 다르다.

결론부터 말하면 volatile 키워드를 사용하게 되면 위의 방식을 통해 const 값을 수정할 수 있다.
ex)

volatile const int cnt = 0;
int* pPtr = (int*)&cnt;
*pPtr = 1111;

std::cout << cnt;

const를 했을 때 주소로 값을 바꿔도 안 바뀌는 이유는 컴파일러에서 막아줘서 이기 때문인데 이러한 volatile 키워드를 쓰게되면 컴파일러가 최적화를 하기 때문에 이러한 const의 주소를 통해 값을 바꿀 때 컴파일러가 확인을 하지 않고 값을 바꾸기 때문에 이러한 값 수정이 가능하게 된다.

느낀점

const 키워드를 사용하면 무조건 값이 바뀌지 않게 될 줄 알았는데 이러한 컴파일러 단위에서 바꿀 수 있다는 점이 정말 컴퓨터 언어는 끝도 없이 배울게 있다는 것이 굉장히 놀랍다.

profile
성장을 멈추지 않는 개발자

0개의 댓글