C언어 초급 - 3장: 변수와 데이터 타입 (3.3 상수 (const))

2025. 2. 23. 16:36프로그래밍 언어/C

3.3 상수 (const)

C 언어에서 상수(Constant)값을 변경할 수 없는 변수를 의미합니다.
일반 변수는 프로그램 실행 중 값이 변경될 수 있지만, 상수는 선언된 후 값이 변하지 않습니다.
상수는 코드의 가독성을 높이고, 오류를 방지하는 데 유용합니다.


1. 상수와 변수의 차이

구분  변수(Variable) 상수(Constant)
값 변경 가능 여부 가능 (a = 10; a = 20;) 불가능 (const int a = 10; 이후 변경 불가)
메모리 저장 방식 메모리에 저장된 값 변경 가능 초기화 이후 변경 불가
사용 목적 가변적인 데이터 저장 변하지 않는 데이터(예: 원주율, 최대 크기 등) 저장

📌 언제 상수를 사용할까?

  • 변하지 않는 값을 명확하게 표현하고 싶을 때 (const double PI = 3.14159;)
  • 실수로 값이 변경되는 것을 방지하고 싶을 때 (#define MAX_SIZE 100)

2. const를 이용한 상수 선언

C 언어에서 상수를 선언하는 방법 중 하나는 const 키워드를 사용하는 것입니다.

2.1 const 키워드를 사용한 상수 선언

#include <stdio.h>

int main() {
    const int MAX_VALUE = 100;  // 정수형 상수 선언
    const float PI = 3.14159;   // 실수형 상수 선언

    printf("최대 값: %d\n", MAX_VALUE);
    printf("원주율: %.5f\n", PI);

    return 0;
}

출력 결과

최대 값: 100
원주율: 3.14159

📌 const를 사용하면 값을 변경할 수 없습니다.

const int MAX_VALUE = 100;
MAX_VALUE = 200;  // 오류 발생! (상수 값 변경 불가)

컴파일 오류 메시지:

error: assignment of read-only variable ‘MAX_VALUE’

2.2 const와 포인터

포인터와 함께 const를 사용할 수도 있습니다.

#include <stdio.h>

int main() {
    int num = 10;
    const int *ptr = &num;  // 포인터가 가리키는 값 변경 불가

    printf("num: %d\n", num);
    
    // *ptr = 20;  // 오류 발생! (상수 포인터가 가리키는 값 변경 불가)
    
    return 0;
}

📌 const를 포인터에 사용할 경우 다음과 같은 조합이 가능

  1. 포인터가 가리키는 값이 상수 (const int *ptr) → *ptr = 20; 불가능
  2. 포인터 자체가 상수 (int *const ptr) → ptr = &b; 불가능
  3. 둘 다 상수 (const int *const ptr) → *ptr = 20; 및 ptr = &b; 모두 불가능

3. #define을 이용한 상수 정의

const 외에도 #define 전처리기 지시문을 사용하여 상수를 정의할 수 있습니다.
#define은 컴파일 전에 상수를 코드 내에서 특정한 값으로 치환하는 역할을 합니다.

3.1 #define을 이용한 상수 선언

#include <stdio.h>

#define PI 3.14159  // 원주율 정의
#define MAX_SIZE 100  // 최대 크기 정의

int main() {
    printf("원주율: %.5f\n", PI);
    printf("최대 크기: %d\n", MAX_SIZE);

    return 0;
}

출력 결과

원주율: 3.14159
최대 크기: 100

📌 #define의 특징

  • 값 변경 불가 → #define으로 정의된 값은 프로그램 실행 중 변경할 수 없음.
  • 메모리를 차지하지 않음 → #define은 컴파일 전에 치환되므로 메모리를 사용하지 않음.
  • 세미콜론(;)이 필요 없음 → #define PI 3.14159; (X) ❌

4. const와 #define의 차이점

구분 const 키워드 #define 전처리기
데이터 타입 지정 가능 가능 (const int, const double) 불가능 (단순 문자열 치환)
메모리 할당 여부 메모리에 저장됨 메모리를 차지하지 않음 (컴파일 시 치환됨)
디버깅 가능 여부 가능 (메모리에 저장되므로 디버깅 가능) 불가능 (컴파일 시 치환되어 추적 어려움)
사용 가능 범위 블록 내부 및 전역적으로 사용 가능 전역적으로만 사용 가능
값 변경 여부 불가능 불가능

📌 언제 const와 #define을 사용할까?

  • 특정 데이터 타입이 필요한 경우 → const 사용 (const double PI = 3.14159;)
  • 단순한 값 치환이 필요한 경우 → #define 사용 (#define MAX_SIZE 100)

5. 예제: const와 #define 비교

#include <stdio.h>

#define MAX 100  // 전처리기로 상수 정의

int main() {
    const int min_value = 10;  // const 키워드 사용

    printf("최대값 (define): %d\n", MAX);
    printf("최소값 (const): %d\n", min_value);

    return 0;
}

출력 결과

최대값 (define): 100
최소값 (const): 10

6. 정리

개념  설명
변수(Variable) 프로그램 실행 중 값이 변경될 수 있는 데이터 저장소
상수(Constant) 프로그램 실행 중 값이 변경될 수 없는 변수 (const 사용)
const 키워드 데이터 타입을 지정하고, 값을 변경할 수 없는 변수를 선언
#define 전처리기 특정 값을 코드 내에서 치환하는 방식으로 상수를 정의
const vs #define const는 메모리를 사용하지만, #define은 단순 치환 방식으로 동작