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 = # // 포인터가 가리키는 값 변경 불가
printf("num: %d\n", num);
// *ptr = 20; // 오류 발생! (상수 포인터가 가리키는 값 변경 불가)
return 0;
}
📌 const를 포인터에 사용할 경우 다음과 같은 조합이 가능
- 포인터가 가리키는 값이 상수 (const int *ptr) → *ptr = 20; 불가능
- 포인터 자체가 상수 (int *const ptr) → ptr = &b; 불가능
- 둘 다 상수 (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은 단순 치환 방식으로 동작 |
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 초급 - 4장: 입출력 함수 (4.2 gets()와 fgets() 비교) (0) | 2025.02.23 |
---|---|
C언어 초급 - 4장: 입출력 함수 (4.1 입력 함수 scanf()) (0) | 2025.02.23 |
C언어 초급 - 3장: 변수와 데이터 타입 (3.2 기본 데이터 타입) (0) | 2025.02.23 |
C언어 초급 - 3장: 변수와 데이터 타입 (3.1 변수란?) (0) | 2025.02.23 |
C언어 초급 - 2장: C 프로그램의 구조 (2.3 출력 함수 printf()) (0) | 2025.02.23 |