본문 바로가기
프로그래밍언어/C언어[초급]

[C언어][초급] Chapter11. 상수와 #define, const 차이 – 바뀌지 않는 값을 다루는 방법

by about_IT 2025. 4. 16.

프로그래밍을 하다 보면 절대로 바뀌지 않아야 하는 값들이 있습니다.
예를 들어 원주율 3.14159, 하루의 시간 24시간, 고정된 요금이나 비율처럼 프로그램 전반에서 여러 번 사용되지만 절대 변경되면 안 되는 값들이죠.

이럴 때는 ‘변수’가 아니라 ‘상수(constant)’를 사용해야 합니다.
이번 글에서는 C언어에서 상수를 선언하는 두 가지 방법인 **#define과 const**에 대해 비교하며 설명해드릴게요.


● 상수란?

상수는 한 번 정해지면 절대로 변경할 수 없는 값입니다.
변수처럼 값을 바꾸는 것이 아니라, 고정된 수치로 프로그램 내에서 의미 있는 이름을 붙여 사용합니다.

#define PI 3.14
const int HOUR = 24;

● #define이란?

#define은 전처리기 지시문으로, 컴파일 전에 특정 텍스트를 다른 값으로 미리 치환하는 역할을 합니다.

#define PI 3.14

int main(void) {
    printf("%.2f\n", PI);  // 출력: 3.14
}
  • PI는 컴파일 전에 3.14로 바뀌어서 처리됩니다.
  • 자료형을 명시하지 않아도 됩니다.
  • 일반적으로 매크로 상수라고 부릅니다.
  • 값을 바꾸려면 원본 #define을 수정해야 합니다.

 장점

  • 코드 전반에서 반복되는 수치를 의미 있는 이름으로 관리할 수 있습니다.
  • 자료형 없이도 사용이 간편합니다.

 단점

  • 디버깅 시에는 실제 값으로 치환되므로 추적이 어렵습니다.
  • 자료형이 없기 때문에 형 관련 오류가 생기기 쉽습니다.

 

● const란?

  • const는 **변경할 수 없는 변수(읽기 전용)**를 선언하는 방법입니다.
  • const로 선언된 변수는 초기화 이후 값이 바뀌지 않습니다.
const float pi = 3.14;
const int hour = 24;

 

  • 반드시 자료형을 함께 선언해야 합니다.
  • 일반 변수처럼 사용되지만, 값을 변경하려 하면 오류가 발생합니다.
const int age = 20;
age = 30; // 오류 발생! const 변수는 변경 불가

 

 장점

  • 자료형이 명확해서 타입 검사를 통해 오류를 방지할 수 있습니다.
  • 디버깅 시 변수처럼 확인이 가능합니다.

 단점

  • 변수처럼 취급되기 때문에 메모리를 차지합니다.
  • 초기화 없이 선언만 하면 사용할 수 없습니다.

● #define vs const 차이 정리


  #define const
선언 위치 함수 밖, 안 모두 가능 주로 함수 밖 또는 안
자료형 없음 반드시 명시해야 함
메모리 사용 사용하지 않음 변수처럼 메모리 사용함
디버깅 어려움 (값만 보임) 쉬움 (변수처럼 추적 가능)
값 변경 여부 불가능 불가능
사용 용도 심볼 상수 (전처리용) 읽기 전용 변수

● 어떤 것을 써야 할까?

  • 컴파일 이전에 간단한 값만 치환해서 사용할 거라면 #define이 적합합니다.
  • 타입 체크가 필요하고, 디버깅이나 코드 안정성이 중요하다면 const가 더 안전합니다.

실제로는 **전역적인 값은 #define, 지역적이고 타입 안전이 필요한 값은 const**로 나누어 사용하는 경우가 많습니다.


실습 문제

아래 문제는 직접 코드를 작성해보고, 실행 결과를 확인한 후 스스로 정답을 유추해보는 형태입니다.

정답은 바로 아래에서 확인할 수 있습니다.

문제 1

매크로 상수 PI를 선언하고, printf를 이용하여 다음과 같이 출력하세요.

원주율은 3.14입니다.

문제 2

const 키워드를 이용하여 HOUR라는 상수를 선언하고 다음과 같이 출력하세요.

하루는 24시간입니다.

문제 3

가격이 10000원일 때, 세율 10%를 #define으로 선언하고, 세금 금액을 출력하는 코드를 작성하세요.

세금: 1000원

문제 4

다음 코드에서 오류가 발생하는 이유를 설명하고 수정하세요.

const int maxScore;
maxScore = 100;

문제 5

소수 값을 저장하기 위해 const float pi를 선언하고, 값을 3.14로 저장하세요.
단, 초기화를 나중에 하면 어떻게 되는지도 확인해보세요.

문제 6

다음 중 올바른 #define 선언은?

A. #define MAX_VALUE 100
B. #define MAX_VALUE = 100;
C. define MAX_VALUE 100
D. #define MAX_VALUE 100.0

문제 7

다음 중 컴파일 오류가 발생하는 코드는?

A. const int level = 3;
B. const int count;
C. #define LIMIT 500
D. float pi = 3.14;

문제 8

아래의 상수 선언을 사용하여, 다음과 같이 출력하는 코드를 완성하세요.

#define PRICE 1200
const float VAT = 0.1;

 

출력 예시:

총 금액: 1320원









▶ 정답 확인하기


정답 1

#define PI 3.14
printf("원주율은 %.2f입니다.\n", PI);

 

정답 2

const int HOUR = 24;
printf("하루는 %d시간입니다.\n", HOUR);

 

정답 3

#define TAX_RATE 0.1
float price = 10000;
printf("세금: %.0f원\n", price * TAX_RATE);

 

정답 4

// const 변수는 반드시 선언과 동시에 초기화해야 함
const int maxScore = 100;

 

정답 5

// 잘못된 예시 (오류 발생)
// const float pi;
// pi = 3.14;

// 올바른 선언
const float pi = 3.14;

 

정답 6

정답: A, D

  • B는 =와 ; 사용이 잘못되었고
  • C는 #define 앞에 # 없음

 

정답 7

정답: B

  • const int count;는 초기화 없이 선언만 하면 오류 발생

 

정답 8

#define PRICE 1200
const float VAT = 0.1;

float total = PRICE * (1 + VAT);
printf("총 금액: %.0f원\n", total);