본문 바로가기

프로그래밍 언어/C

C언어 상수(Constant), const 키워드와 상수 활용하기

C언어 상수(Constant), const 키워드와 상수 활용하기

C 언어에서 상수(Constant)는 프로그램 내에서 변경되지 않는 고정된 값을 의미합니다. 상수는 코드의 가독성을 높이고, 의도하지 않은 값 변경을 방지하는 데 중요한 역할을 합니다. 본 문서에서는 C 언어에서 상수를 정의하고 활용하는 다양한 방법을 심층적으로 다룹니다.

 

 

목차

  1. 상수(Constant)란 무엇인가?
  2. const 키워드의 개념과 활용
  3. 매크로 상수 vs. const 상수
  4. 열거형 상수(enum) 활용
  5. const와 read-only 변수 차이
  6. 메모리 관점에서 본 상수
  7. 상수를 활용한 코드 최적화

 

1. 상수(Constant)란 무엇인가?

상수(Constant)는 프로그램 실행 중 값이 변경되지 않는 변수입니다. 예를 들어, 원주율(π)이나 특정 프로그램에서 변경되지 않는 최대 크기 등의 값이 있습니다.

  • 숫자 상수: 3.14159, 100, -20
  • 문자 상수: 'A', 'Z', '1'
  • 문자열 상수: "Hello", "C Programming"

 

 

 

2. const 키워드의 개념과 활용

const 키워드는 변수 선언 시 값을 변경할 수 없도록 지정하는 역할을 합니다.

#include <stdio.h>

int main() {
    const int MAX_SIZE = 100;
    MAX_SIZE = 200;  // 오류 발생
    return 0;
}
    

위 코드에서 MAX_SIZE를 변경하려고 하면 컴파일 오류가 발생합니다.

 

 

 

3. 매크로 상수 vs. const 상수

C 언어에서 상수를 정의하는 또 다른 방법은 #define 매크로를 사용하는 것입니다.

#define PI 3.14159

const double pi = 3.14159;
    
구분 매크로 (#define) const 키워드
컴파일 시 처리 전처리기 단계 컴파일러 단계
메모리 사용 메모리 할당 없음 메모리에 저장
디버깅 디버깅 어려움 디버깅 가능

 

 

 

4. 열거형 상수(enum) 활용

열거형(enum)은 연관된 상수 값들을 그룹화하는 데 사용됩니다.

enum Color { RED = 1, GREEN, BLUE };

int main() {
    enum Color myColor = GREEN;
    return 0;
}
    

 

 

 

 

5. const와 read-only 변수 차이

C 언어에서 const 키워드는 변수의 값을 변경할 수 없도록 만드는 역할을 합니다. 그러나 포인터와 결합될 때는 여러 가지 변형이 존재하며, 헷갈리기 쉬운 개념 중 하나입니다.

const 키워드의 위치에 따른 차이

const 키워드가 변수 또는 포인터의 어느 위치에 배치되는지에 따라 변수의 읽기 전용 속성이 달라집니다.

  • const int a = 10;변수의 값 변경 불가
  • const int *ptr;포인터가 가리키는 값 변경 불가
  • int *const ptr;포인터 주소 변경 불가
  • const int *const ptr;포인터 주소와 값 모두 변경 불가

포인터와 const의 조합 예제

#include <stdio.h>

int main() {
    int x = 10, y = 20;
    const int *ptr1 = &x;   // 값 변경 불가, 포인터 변경 가능
    int *const ptr2 = &x;   // 포인터 변경 불가, 값 변경 가능
    const int *const ptr3 = &x; // 값, 포인터 모두 변경 불가

    ptr1 = &y;   // 가능
    *ptr2 = 30;  // 가능
    ptr2 = &y;   // 오류 발생
    *ptr3 = 40;  // 오류 발생

    return 0;
}
    

위 코드에서 ptr1은 가리키는 값을 변경할 수 없지만, 다른 주소를 가리킬 수 있습니다. 반면 ptr2는 포인터 주소를 변경할 수 없으며, 가리키는 값만 변경 가능합니다. ptr3는 값과 주소 모두 변경할 수 없습니다.

const와 read-only 변수의 차이

일부 프로그래밍 언어(C++, C# 등)에서는 const 외에도 read-only 변수를 제공합니다. 하지만 C에서는 const 만을 사용하며, 읽기 전용 변수를 만들려면 const 키워드를 활용해야 합니다.

 

 

 

6. 메모리 관점에서 본 상수

C 언어에서 상수는 데이터 메모리 영역 중 하나인 .rodata (Read-Only Data) 섹션에 저장됩니다. 반면, 일반 변수는 stack 또는 heap 영역에 위치합니다.

메모리 영역별 상수 저장 위치

메모리 영역 설명 저장되는 데이터
.rodata 읽기 전용 데이터 영역 const 상수, 문자열 리터럴
stack 함수 호출 시 생성되는 지역 변수 저장 지역 변수, 매개변수
heap 동적 할당된 변수 저장 malloc 등의 할당된 데이터

예제 코드: 상수의 메모리 주소 확인

#include <stdio.h>

int main() {
    const int num = 10;
    printf("num의 메모리 주소: %p\n", (void*)&num);
    return 0;
}
    

 

 

 

7. 상수를 활용한 코드 최적화

상수를 활용하면 코드의 유지보수성이 높아지고, 예기치 않은 오류를 방지할 수 있습니다. 특히, 매직 넘버(Magic Number)를 제거하고 의미 있는 변수명을 사용하면 가독성이 크게 향상됩니다.

좋은 코드 vs. 나쁜 코드

나쁜 예: 직접 숫자를 사용한 코드

for (int i = 0; i < 100; i++) {  // 100은 의미 불명확
    printf("반복 횟수: %d\n", i);
}
    

좋은 예: 상수를 사용한 코드

#define MAX_LOOP 100

for (int i = 0; i < MAX_LOOP; i++) {
    printf("반복 횟수: %d\n", i);
}
    

상수를 활용한 코드 최적화 전략

  • 반복 사용되는 값은 상수로 정의: 코드 중복 감소
  • 매직 넘버 제거: 가독성 향상
  • enum 활용: 의미 있는 상수 값 그룹화
  • 메모리 사용 최적화: 불필요한 변수 선언 방지

코드 유지보수성을 위한 const 활용

다음은 const를 활용한 유지보수성을 높이는 방법입니다.

#include <stdio.h>

const double TAX_RATE = 0.1;  // 세금 비율을 상수로 정의

double calculateTotal(double price) {
    return price + (price * TAX_RATE);
}

int main() {
    double price = 1000.0;
    printf("최종 가격: %.2f\n", calculateTotal(price));
    return 0;
}
    

위 예제처럼 상수를 사용하면 코드 수정이 필요할 때 한 곳에서만 변경하면 되므로 유지보수성이 향상됩니다.

결론: C 언어에서 상수를 적절히 활용하면 코드의 안정성과 유지보수성이 크게 향상됩니다.