정적(static) 변수는 프로그램이 실행되는 동안 계속 메모리에 유지되는 변수입니다. 즉, 수명(lifetime)이 프로그램 전체 실행 기간과 같습니다. 이는 자동(automatic) 변수와 대비되는데, 자동 변수는 해당 함수가 실행 중일 때만 메모리에 존재하며 함수가 종료되면 소멸합니다.
정적 변수의 저장 위치: 데이터 세그먼트
정적 변수는 메모리의 데이터 세그먼트(data segment)에 저장됩니다. 데이터 세그먼트는 프로그램의 가상 주소 공간(virtual address space)을 구성하는 영역 중 하나입니다.
데이터 세그먼트는 초기화 여부에 따라 두 가지로 나뉩니다.
- 초기화되지 않은 데이터 세그먼트(BSS 세그먼트): 명시적인 초기화가 없거나 0으로 초기화된 정적 변수가 저장됩니다.
- 초기화된 데이터 세그먼트: 특정 값으로 초기화된 정적 변수가 저장됩니다.
다음 예제를 통해 확인할 수 있습니다.
static int x = 5; static int y;
위 코드에서 정적 변수 x는 값 5로 초기화되었으므로 초기화된 데이터 세그먼트에 저장되고, 초기화되지 않은 정적 변수 y는 BSS 세그먼트에 저장됩니다.
C 언어 예제 프로그램
정적 변수의 동작을 보여주는 C 프로그램은 다음과 같습니다.
#include<stdio.h>
int func(){
static int i = 4 ;
i++;
return i;
}
int main(){
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
printf("%d\n", func());
return 0;
}위 프로그램의 실행 결과는 다음과 같습니다.
5 6 7 8 9 10
프로그램 동작 원리
함수 func() 내에서 i는 4로 초기화된 정적 변수입니다. 따라서 초기화된 데이터 세그먼트에 저장됩니다. 이후 i는 1씩 증가하고 그 값이 반환됩니다. 해당 코드는 다음과 같습니다.
int func(){
static int i = 4 ;
i++;
return i;
}main() 함수에서는 func()를 총 6번 호출하고, 반환된 i의 값을 출력합니다. i가 정적 변수이기 때문에 프로그램이 실행되는 동안 메모리에 그대로 유지되며, 함수 호출이 끝나도 값이 사라지지 않습니다. 그 결과 매 호출마다 이전 값에서 1씩 증가한 일관된 값(5, 6, 7, 8, 9, 10)이 출력되는 것입니다.
만약 i가 일반적인 지역 변수였다면 함수가 호출될 때마다 4로 새로 초기화되고 함수 종료 시 소멸하므로, 항상 5만 출력되었을 것입니다. 이것이 정적 변수와 자동 변수의 가장 큰 차이점입니다.