C 또는 C++에서는 const 키워드를 사용하여 상수 변수를 선언할 수 있습니다. 상수 변수는 한 번 초기화되면 그 값을 다시 변경할 수 없도록 설계되어 있습니다. 하지만 때로는 특정 기법을 통해 상수 변수의 값을 우회적으로 변경해야 하는 경우가 생기기도 합니다.
이 글에서는 const 변수에 직접 값을 대입했을 때 발생하는 오류와, 포인터를 활용해 상수 변수의 값을 변경하는 방법을 예제 코드와 함께 살펴보겠습니다.
const 변수에 직접 대입하면 발생하는 일
const로 선언된 변수에 새로운 값을 대입하려고 하면 컴파일 시점에 에러가 발생합니다. 아래 코드를 통해 확인해 보겠습니다.
예제 코드
#include <stdio.h>
main() {
const int x = 10; // 상수 int 변수 정의
printf("x = %d\n", x);
x = 15; // 상수 값 변경 시도
printf("x = %d\n", x);
}실행 결과
[Error] assignment of read-only variable 'x'
위 코드처럼 읽기 전용(read-only)으로 선언된 변수에 값을 대입하면 컴파일러가 이를 허용하지 않고 에러를 출력합니다. 즉, 일반적인 방법으로는 const 변수의 값을 바꿀 수 없습니다.
포인터를 사용한 const 변수 값 변경
그렇다면 const 변수의 값을 변경할 방법은 없을까요? 포인터를 사용하면 가능합니다. const 변수의 주소를 가리키는 포인터를 만들고, 해당 포인터를 통해 역참조하여 값을 대입하면 컴파일 에러 없이 값이 변경됩니다.
예제 코드
#include <stdio.h>
main() {
const int x = 10; // 상수 int 변수 정의
int *ptr;
printf("x = %d\n", x);
ptr = &x; // ptr이 변수 x를 가리킴
*ptr = 15; // 포인터를 통한 값 갱신
printf("x = %d\n", x);
}실행 결과
x = 10 x = 15
포인터 ptr이 const 변수 x의 주소를 가리킨 뒤, *ptr = 15; 구문으로 값을 갱신하자 실제로 x의 값이 15로 변경된 것을 확인할 수 있습니다.
주의 사항
이 방법은 동작하지만, const 키워드의 존재 의미인 불변성(immutability)을 깨뜨리는 행위입니다. 컴파일러 최적화 과정에서 예상치 못한 결과가 발생하거나, 미정의 동작(undefined behavior)으로 이어질 수 있으므로 실제 프로젝트에서는 권장되지 않습니다. 이 기법은 C 언어의 메모리 구조와 포인터 동작 원리를 학습하기 위한 목적으로 이해하는 것이 좋습니다.