정적 변수(static variable)는 static 키워드를 사용하여 선언된 변수를 말합니다. 정적 변수의 메모리 공간은 프로그램 전체 실행 과정에서 단 한 번만 할당되며, 이 공간은 프로그램이 종료될 때까지 계속 사용됩니다.
정적 변수는 한 번 선언되면 프로그램이 실행되는 동안 계속 존재합니다. 따라서 정적 변수의 수명(lifetime)은 곧 프로그램의 수명과 같습니다.
예제 코드
다음은 정적 변수의 동작을 보여주는 간단한 C++ 프로그램입니다.
#include <iostream>
using namespace std;
void func() {
static int num = 1;
cout << "num의 값: " << num << "\n";
num++;
}
int main() {
func();
func();
func();
return 0;
}실행 결과
num의 값: 1 num의 값: 2 num의 값: 3
코드 분석
위 프로그램의 동작을 자세히 살펴보겠습니다.
func() 함수 내부
func() 함수 안에서 num은 정적 변수로 선언되어 있으며, 초기화는 프로그램 실행 중 단 한 번만 수행됩니다. 이후 함수가 호출될 때마다 현재 num의 값을 출력하고 값을 1씩 증가시킵니다.
void func() {
static int num = 1; // 최초 호출 시에만 초기화됨
cout << "num의 값: " << num << "\n";
num++;
}만약 num이 일반 지역 변수였다면 함수가 호출될 때마다 매번 1로 초기화되어 항상 같은 값이 출력되었을 것입니다. 하지만 정적 변수는 이전 호출에서 변경된 값을 그대로 유지합니다.
main() 함수 내부
main() 함수에서는 func()를 세 번 호출합니다. 그럼에도 불구하고 num의 메모리 할당과 초기화는 첫 번째 호출 시 한 번만 이루어지며, 두 번째와 세 번째 호출에서는 기존 값을 이어서 사용합니다.
int main() {
func(); // num = 1 출력 후 2로 증가
func(); // num = 2 출력 후 3으로 증가
func(); // num = 3 출력 후 4로 증가
return 0;
}정리
- 정적 변수는
static키워드로 선언하며, 메모리는 프로그램 시작 시 한 번만 할당됩니다. - 정적 변수의 수명은 프로그램 전체 실행 기간과 동일합니다.
- 함수 내 정적 변수는 함수가 여러 번 호출되더라도 초기화는 한 번만 수행되며, 값은 호출 사이에 유지됩니다.
- 다만 정적 변수의 범위(scope)는 여전히 해당 함수 내부로 제한되므로, 함수 외부에서는 접근할 수 없습니다.