C언어 상수(Constant), const 키워드와 상수 활용하기
C 언어에서 상수(Constant)는 프로그램 내에서 변경되지 않는 고정된 값을 의미합니다. 상수는 코드의 가독성을 높이고, 의도하지 않은 값 변경을 방지하는 데 중요한 역할을 합니다. 본 문서에서는 C 언어에서 상수를 정의하고 활용하는 다양한 방법을 심층적으로 다룹니다.
목차
- 상수(Constant)란 무엇인가?
- const 키워드의 개념과 활용
- 매크로 상수 vs. const 상수
- 열거형 상수(enum) 활용
- const와 read-only 변수 차이
- 메모리 관점에서 본 상수
- 상수를 활용한 코드 최적화
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 언어에서 상수를 적절히 활용하면 코드의 안정성과 유지보수성이 크게 향상됩니다.
'프로그래밍 언어 > C' 카테고리의 다른 글
C 언어 실수형 데이터 타입 정리: float, double, long double (0) | 2025.04.21 |
---|---|
C 언어 정수형(Integer Types) 크기, 범위, 활용법 (0) | 2025.04.15 |
C 언어 문자형 데이터 타입 정리, char의 개념과 활용법 (0) | 2025.04.03 |
C 언어 실수형(Floating-Point Types) 이해하기, 정밀도와 메모리 크기 비교 (0) | 2025.03.28 |
C 언어 정수형 데이터 타입 정리: int, short, long, unsigned (0) | 2025.03.22 |