C 저장 클래스 이해: auto, extern, static, register 완벽 해설
C에서 저장 클래스(Storage Class)란?
저장 클래스는 변수의 범위(scope), 위치, 초기화, 수명(lifetime), 접근성을 정의합니다. C에서 모든 변수는 타입뿐만 아니라 저장 클래스도 가지며, 이것이 변수가 어디에서 어떻게 접근될 수 있는지를 결정합니다.
표준 저장 클래스는 네 가지입니다:
- auto – 지역 변수의 기본값
- extern – 다른 파일에 존재하는 전역 변수나 함수 선언
- static – 함수 호출 간 값 보존, 파일 또는 함수로 가시성 제한
- register – 변수를 CPU 레지스터에 저장하여 빠른 접근 힌트 제공
Auto 저장 클래스
auto로 선언된 변수(지역 변수의 기본값)는 정의된 블록 내에서만 존재합니다. 블록을 벗어나면 소멸하며, 명시적으로 설정하지 않으면 비결정적 값으로 초기화됩니다.
int add(void) {
int a = 13;
auto int b = 48; // auto는 선택적
return a + b;
}
범위 시연:
#include <stdio.h>
int main(void) {
auto int j = 1;
{
auto int j = 2;
{
auto int j = 3;
printf("%d ", j); // 3 출력
}
printf("\t%d ", j); // 2 출력
}
printf("%d\n", j); // 1 출력
}
출력: 3 2 1
Extern 저장 클래스
extern 키워드는 다른 번역 단위(translation unit)에 정의된 변수나 함수를 선언합니다. 소스 파일 간 데이터 공유를 가능하게 합니다.
/* main.c */
#include <stdio.h>
extern int i; // 선언
int main(void) {
printf("value of the external integer is = %d\n", i);
return 0;
}
/* original.c */
#include <stdio.h>
int i = 48; // 정의
두 파일을 함께 컴파일: gcc main.c original.c -o program. ./program 실행 시 출력:
value of the external integer is = 48
Static 저장 클래스
정적 변수는 프로그램 실행 기간 동안 값을 유지합니다. 지역 정적 또는 파일 범위 정적으로 사용 가능.
- 지역 정적(Local static) – 함수 내부에서만 가시적이지만 호출 간 지속
- 파일 범위 정적(File-scope static) – 선언된 파일 내에서만 가시적
/* 전역 정적 */
static int counter = 7;
void next(void) {
/* 지역 정적 */
static int iteration = 13;
iteration++;
printf("iteration=%d and counter=%d\n", iteration, counter);
}
int main(void) {
while (counter < 10) {
next();
counter++;
}
return 0;
}
출력:
iteration=14 and counter=7
iteration=15 and counter=8
iteration=16 and counter=9
Register 저장 클래스
자주 접근되고 CPU 레지스터에 들어갈 수 있는 변수에 register 사용. 레지스터가 부족하면 컴파일러가 힌트를 무시할 수 있습니다.
#include <stdio.h>
int main(void) {
register int weight;
/* 주소 취득 시도 시 실패 */
// int *ptr = &weight; // 컴파일 에러
return 0;
}
컴파일 결과:
error: address of register variable 'weight' requested
요약 표
| 저장 클래스 | 선언 위치 | 저장 위치 | 기본값 | 범위 | 수명 |
| auto | 함수/블록 내부 | 메모리 | 불확정 | 함수/블록 | 함수/블록 |
| register | 함수/블록 내부 | CPU 레지스터 | 불확정 | 함수/블록 | 함수/블록 |
| extern | 모든 함수 외부 | 메모리 | 0 | 전체 프로그램 | 프로그램 런타임 |
| static (지역) | 함수/블록 내부 | 메모리 | 0 | 함수/블록 | 프로그램 런타임 |
| static (전역) | 모든 함수 외부 | 메모리 | 0 | 파일 | 프로그램 런타임 |
핵심 요약
- 저장 클래스는 변수의 가시성과 수명 제어
- 표준 지역 변수에는
auto 사용
- 성능 중요 카운터에
register 사용 (컴파일러 지원에 따라)
- 함수 호출 간 상태 보존 또는 파일 범위 제한에
static 사용
- 소스 파일 간 변수/함수 공유에
extern 사용