문제
C 언어에는 어떤 스토리지 클래스(기억 클래스)들이 있으며, 각각 어떤 특징을 가지고 있을까요? 프로그램 예제와 함께 살펴보겠습니다.
스토리지 클래스란?
스토리지 클래스(storage class)는 C 프로그램 안에서 변수나 함수가 어디까지 유효한지를 나타내는 범위(scope)와 얼마나 오래 존재하는지를 나타내는 생존 기간(lifetime)을 정의하는 개념입니다.
C 언어의 4가지 스토리지 클래스
C 언어에서 사용할 수 있는 스토리지 클래스는 다음과 같습니다.
- auto (자동 변수)
- extern (외부 변수)
- static (정적 변수)
- register (레지스터 변수)
1. 자동 변수 (Automatic / Local Variables)
- 키워드: auto
- 흔히 지역 변수(local variable)라고도 부릅니다.
- 범위: 변수가 선언된 블록({ }) 내부에서만 유효하며, 블록을 벗어나면 소멸합니다.
- 기본값: 별도로 초기화하지 않으면 쓰레기 값(garbage value)이 저장됩니다.
예제
#include<stdio.h>
void main (){
auto int i=1;{
auto int i=2;{
auto int i=3;
printf ("%d",i);
}
printf("%d", i);
}
printf("%d", i);
}실행 결과
3 2 1
같은 이름의 변수 i가 서로 다른 블록에서 각각 선언되었기 때문에, 가장 안쪽 블록부터 차례대로 3, 2, 1이 출력됩니다. 즉, 각 블록의 지역 변수는 자신이 속한 블록 안에서만 독립적으로 동작합니다.
2. 전역 변수 (Global / External Variables)
- 키워드: extern
- 블록 바깥쪽, 즉 모든 함수 외부에 선언되기 때문에 전역 변수(global variable)라고도 합니다.
- 범위: 프로그램 전체(모든 함수)에서 접근할 수 있습니다.
- 기본값: 초기화하지 않으면 0(zero)으로 설정됩니다.
예제
#include<stdio.h>
extern int i =1; /* 이 'i'는 프로그램 전체에서 사용 가능 */
main (){
int i = 3; /* 이 'i'는 main 함수 안에서만 유효 */
printf ("%d", i);
fun ();
}
fun (){
printf ("%d", i);
}실행 결과
31
main 함수 안에서는 지역 변수 i = 3이 우선 적용되어 3이 출력되고, fun 함수 안에는 지역 변수가 없으므로 전역 변수 i = 1이 출력됩니다.
3. 정적 변수 (Static Variables)
- 키워드: static
- 범위: 함수 호출이 끝나더라도 값이 유지되며, 프로그램이 종료될 때까지 생존합니다.
- 초기화는 프로그램 실행 중 단 한 번만 수행됩니다.
- 기본값: 초기화하지 않으면 0(zero)으로 설정됩니다.
예제
#include<stdio.h>
main (){
inc ();
inc ();
inc ();
}
inc (){
static int i =1;
printf ("%d", i);
i++;
}실행 결과
1 2 3
inc 함수를 세 번 호출했지만, static 변수 i는 함수 호출 사이에 값이 유지되면서 1씩 증가하기 때문에 1, 2, 3이 순서대로 출력됩니다. 만약 static 대신 일반 지역 변수였다면 매번 1만 출력되었을 것입니다.
4. 레지스터 변수 (Register Variables)
- 키워드: register
- 일반 변수처럼 메모리(RAM)에 저장되는 것이 아니라, CPU의 레지스터에 저장됩니다.
- 레지스터는 CPU 내부의 고속 임시 저장 장치이므로, 반복문 카운터처럼 빠른 접근이 필요한 변수에 적합합니다.
- 레지스터의 개수와 크기는 제한적이므로, 컴파일러가 판단하여 요청이 거부될 수도 있습니다.
예제
#include<stdio.h>
main (){
register int i;
for (i=1; i<=5; i++)
printf ("%d",i);
}실행 결과
1 2 3 4 5
반복 횟수가 많은 for 문의 카운터 변수를 register로 선언하면 메모리 접근 없이 연산을 수행할 수 있어 실행 속도가 향상될 수 있습니다.
정리: 스토리지 클래스 비교표
| 구분 | auto | extern | static | register |
|---|---|---|---|---|
| 저장 위치 | 메모리(스택) | 메모리(데이터 영역) | 메모리(데이터 영역) | CPU 레지스터 |
| 기본값 | 쓰레기 값 | 0 | 0 | 쓰레기 값 |
| 범위 | 선언된 블록 내부 | 프로그램 전체 | 블록 또는 파일 내부 | 선언된 블록 내부 |
| 생존 기간 | 블록 실행 동안 | 프로그램 종료 시까지 | 프로그램 종료 시까지 | 블록 실행 동안 |