Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어에서 const 변수의 값을 변경하는 방법

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 언어의 메모리 구조와 포인터 동작 원리를 학습하기 위한 목적으로 이해하는 것이 좋습니다.