프로그래밍을 하다 보면 절대로 바뀌지 않아야 하는 값들이 있습니다.
예를 들어 원주율 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);
'프로그래밍언어 > C언어[초급]' 카테고리의 다른 글
[C언어][초급] Chapter13. 자료형 크기와 sizeof 연산자 – 메모리 크기를 알아보자 (0) | 2025.04.16 |
---|---|
[C언어][초급] Chapter12. 기본 자료형 – int, float, char의 의미와 역할 (0) | 2025.04.16 |
[C언어][초급] Chapter10. 변수 선언과 초기화 – 데이터를 저장하는 첫걸음 (0) | 2025.04.16 |
[C언어][초급] Chapter09. 서식 지정자 사용법 – 다양한 값 출력의 핵심 (8) | 2025.04.15 |
[C언어][초급] Chapter08. 입력 함수 scanf – 사용자로부터 값 받아오기 (0) | 2025.04.15 |