C 언어 const 완전 가이드 | 포인터·함수 안전 사용법 상세 해설

1. C언어에서 const란?

C 언어를 사용해 프로그램을 작성할 때, 실수로 변수의 값이 바뀌는 것을 방지하는 데 도움이 되는 것이 const 키워드입니다. const는 “이 변수의 값은 변경하지 않겠다!”라고 선언하기 위한 것으로, 한 번 값을 설정하면 그 이후에는 그 값을 변경할 수 없게 합니다. 예를 들어, 다음 코드를 보세요:
const int x = 10;
x = 20;  // 오류 발생!
이와 같이 const를 사용함으로써, x의 값을 고정하고, 실수로 변경되는 것을 방지합니다. 변수가 “자유롭게 되고 싶다!”라고 외치는 것을 막음으로써, 프로그램 전체의 안정성을 확보할 수 있습니다.

2. 왜 const를 사용해야 할까?

2.1 코드의 안전성을 향상시킨다

const를 사용하면, 특정 변수나 데이터가 의도치 않게 변경되는 위험을 줄일 수 있습니다. 예를 들어, 중요한 설정값이나 상수를 실수로 변경하면 프로그램 전체가 불안정해질 가능성이 있지만, const를 사용함으로써 이를 방지할 수 있습니다.

2.2 컴파일러 최적화의 이점을 얻는다

const를 사용함으로써, 컴파일러가 “이 값은 변경되지 않는다”고 판단하여 보다 효율적인 최적화를 수행할 수 있습니다. 특히, const 변수는 캐시되기 쉬워, 자주 사용되는 경우에도 성능 향상이 기대됩니다.

2.3 가독성과 팀 작업을 향상시킨다

const를 사용하는 것은 코드 가독성을 높이는 베스트 프랙티스입니다. 특히 팀 개발에서는 const를 사용함으로써 “이 값은 변하지 않는다”는 의도가 명확히 전달되어, 다른 개발자가 실수로 변수를 변경하는 것을 방지합니다.
侍エンジニア塾

3. 포인터와 const: 그 관계를 이해하자

포인터와 const의 관계는 C 언어를 배우는 데 있어 특히 혼동하기 쉬운 포인트입니다。const가 어디에 배치되는지에 따라 포인터와 그가 가리키는 값의 동작이 달라집니다。
  • const int *p; 이 경우, p가 가리키는 값(즉 *p)은 변경할 수 없지만, p 자체, 즉 포인터가 가리키는 대상은 변경 가능합니다。
  • int *const p; 여기서는 p 자체를 변경할 수 없다는 의미입니다。 즉, p는 다른 주소를 가리킬 수 없지만, *p(포인터가 가리키는 값)는 변경 가능합니다。
  • const int *const p; 이 경우, 포인터 p도 그가 가리키는 값도 모두 변경할 수 없습니다。 바로 “절대 변하지 않는다!” 상태입니다。
포인터 사용은 매우 강력하지만, 그만큼 실수하면 버그가 발생하기 쉬우니 const의 배치에 주의합시다。

4. 실용적인 const 활용 예

4.1 함수 인자에 const 사용

함수에 배열이나 포인터를 전달할 때, 해당 데이터를 변경하고 싶지 않은 경우에 const를 사용합니다. 예를 들어, 다음과 같이 const를 사용하면 함수 내부에서 배열의 내용이 변경되는 것을 방지할 수 있습니다.
void printArray(const int arr[], int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("
");
}
이를 통해 배열 데이터를 안전하게 참조할 수 있습니다.

4.2 룩업 테이블에 const 사용

룩업 테이블처럼 프로그램 실행 중에 변경할 필요가 없는 데이터에는 const를 사용하는 것이 일반적입니다. 아래 예시는 요일을 나타내는 문자열을 고정 데이터로 다루고 있습니다.
const char *days[] = {"월요일", "화요일", "수요일"};
이를 통해 데이터가 실수로 변경되지 않고 프로그램 내에서 안정적으로 사용할 수 있습니다.

5. const의 오용과 주의점

5.1 const의 오용 예

const를 잘못 사용하면, 예상치 못한 동작이나 오류를 일으킬 수 있습니다. 아래 예를 확인해 보세요:
void modifyArray(const int arr[], int size) {
    arr[0] = 10;  // 컴파일 오류!
}
이 함수에서는 const 수식자가 붙은 배열 arr의 요소를 변경하려고 하지만, 이로 인해 컴파일 오류가 발생합니다. const는 “변경 불가”를 보장하는 것이며, 억지로 변경하려 하면 오류가 발생합니다.

5.2 const와 캐스트의 주의점

const_cast를 사용하여 const 수식자를 제거하는 것도 가능하지만, 여기에는 큰 위험이 따릅니다. 특히 시스템에 의존하는 경우나 정의되지 않은 동작을 일으킬 가능성이 있기 때문에, 원칙적으로 피해야 합니다. 안전한 코드를 작성하기 위해서는 const의 의미를 존중하는 것이 중요합니다。

6. 결론

C 언어에서 const는 코드의 안전성을 높이고, 성능을 최적화하기 위한 중요한 도구입니다. 변수와 포인터에 적절히 const를 사용함으로써 프로그램의 안정성을 확보하고, 버그를 사전에 방지할 수 있습니다. 다음에 프로그램을 작성할 때는 const를 적극적으로 도입하여 보다 견고한 코드를 만들어 보세요. 의외로, “여기에도 const를 사용했어야 했나”라고 깨닫는 경우가 많이 있을지도 모릅니다!