C 언어에서 스토리지 클래스(storage class)는 변수나 함수의 가시성(visibility)과 범위(scope)와 같은 특성을 정의하는 키워드입니다. 즉, 변수가 어디에서 접근 가능한지, 얼마나 오래 메모리에 유지되는지 등을 결정합니다.
C 언어의 스토리지 클래스는 크게 네 가지로 나뉩니다.
- 자동 변수 (Automatic,
auto) - 외부 변수 (External,
extern) - 정적 변수 (Static,
static) - 레지스터 변수 (Register,
register)
각각의 특징을 예제 코드와 함께 자세히 살펴보겠습니다.
1. auto — 자동 변수
auto는 모든 지역 변수에 적용되는 기본 스토리지 클래스입니다. 함수가 호출될 때 생성되며, 함수의 실행이 끝나면 자동으로 소멸합니다.
함수 내부에서만 유효하기 때문에 '지역 변수(local variable)'라고도 부르며, 별도로 초기화하지 않으면 컴파일러가 임의의 값(쓰레기 값, garbage value)을 할당합니다.
범위(Scope) — 변수가 선언된 함수 블록 내부로 한정됩니다.
기본값(Default value) — 초기화하지 않으면 쓰레기 값(garbage value)이 할당됩니다.
수명(Lifetime) — 변수가 정의된 블록의 실행 기간과 동일합니다.
예제 코드
#include <stdio.h>
int main() {
auto int a = 28;
int b = 8;
printf("auto 변수의 값 : %d\n", a);
printf("auto 변수와 int 변수의 합 : %d", (a+b));
return 0;
}
실행 결과
auto 변수의 값 : 28
auto 변수와 int 변수의 합 : 36
2. extern — 외부 변수
extern으로 선언된 외부 변수는 흔히 말하는 전역 변수(global variable)입니다. 함수 외부에서 정의되며, 프로그램 전체 어디에서든 접근할 수 있습니다. 또한 각 함수에서 전역 변수의 값을 수정할 수도 있습니다.
범위(Scope) — 특정 함수에 속하지 않고 프로그램 전체(전역)에서 유효합니다.
기본값(Default value) — 별도로 초기화하지 않으면 0(zero)으로 초기화됩니다.
수명(Lifetime) — 프로그램 실행이 종료될 때까지 유지됩니다.
예제 코드
#include <stdio.h>
extern int x = 32;
int b = 8;
int main() {
auto int a = 28;
extern int b;
printf("auto 변수의 값 : %d\n", a);
printf("extern 변수 x와 b의 값 : %d,%d\n", x, b);
x = 15;
printf("수정된 extern 변수 x의 값 : %d\n", x);
return 0;
}
실행 결과
auto 변수의 값 : 28
extern 변수 x와 b의 값 : 32,8
수정된 extern 변수 x의 값 : 15
3. static — 정적 변수
static 변수는 단 한 번만 초기화되며, 컴파일러가 프로그램이 종료될 때까지 해당 변수를 메모리에 유지합니다. 함수 내부뿐 아니라 함수 외부에서도 정의할 수 있다는 점이 특징입니다.
함수 안에서 선언된 static 변수는 함수가 여러 번 호출되더라도 이전 호출에서의 값을 그대로 기억하고 있습니다.
범위(Scope) — 변수가 선언된 블록 내부로 한정됩니다.
기본값(Default value) — 별도로 초기화하지 않으면 0(zero)으로 초기화됩니다.
수명(Lifetime) — 프로그램 실행이 종료될 때까지 유지됩니다.
예제 코드
#include <stdio.h>
int main() {
auto int a = -28;
static int b = 8;
printf("auto 변수의 값 : %d\n", a);
printf("static 변수 b의 값 : %d\n", b);
if(a != 0)
printf("static 변수와 auto 변수의 합 : %d\n", (b+a));
return 0;
}
실행 결과
auto 변수의 값 : -28
static 변수 b의 값 : 8
static 변수와 auto 변수의 합 : -20
4. register — 레지스터 변수
register 변수는 변수를 메모리(RAM) 대신 CPU 레지스터에 저장하도록 컴파일러에 요청하는 키워드입니다. 자주 사용되는 변수를 레지스터에 두면 접근 속도가 훨씬 빨라집니다.
다만 레지스터 변수는 메모리 주소가 없기 때문에 &(주소 연산자)를 사용해 주소를 얻을 수 없습니다. 참고로 register는 단순한 '요청'일 뿐이며, 사용 가능한 레지스터가 없으면 일반 변수처럼 메모리에 저장됩니다.
범위(Scope) — 변수가 선언된 함수 내부로 한정됩니다.
기본값(Default value) — 초기화하지 않으면 쓰레기 값(garbage value)이 할당됩니다.
수명(Lifetime) — 변수가 정의된 블록의 실행이 끝날 때까지 유지됩니다.
예제 코드
#include <stdio.h>
int main() {
register char x = 'S';
register int a = 10;
auto int b = 8;
printf("register 변수 x의 값 : %c\n", x);
printf("auto 변수와 register 변수의 합 : %d", (a+b));
return 0;
}
실행 결과
register 변수 x의 값 : S
auto 변수와 register 변수의 합 : 18
정리: C 스토리지 클래스 비교표
| 스토리지 클래스 | 저장 위치 | 기본값 | 범위(Scope) | 수명(Lifetime) |
|---|---|---|---|---|
| auto | 메모리(스택) | 쓰레기 값 | 블록 내부 | 블록 실행 기간 |
| extern | 메모리(데이터 영역) | 0 | 프로그램 전체 | 프로그램 종료 시까지 |
| static | 메모리(데이터 영역) | 0 | 블록 내부 | 프로그램 종료 시까지 |
| register | CPU 레지스터 | 쓰레기 값 | 함수 내부 | 블록 실행 기간 |
네 가지 스토리지 클래스의 차이를 이해하면 변수의 생명주기와 접근 범위를 의도대로 제어할 수 있으며, 더 안전하고 효율적인 C 프로그램을 작성하는 데 큰 도움이 됩니다.