정적 변수 (Static Variable)
정적 변수는 프로그램이 종료될 때까지 메모리에 유지되는 변수이다.
일반 지역 변수와 달리 함수가 종료되어도 값이 사라지지 않는다.
특징
- 프로그램 시작 시 생성된다.
- 프로그램 종료 시 제거된다.
- 한 번만 생성된다.
- 함수가 종료되어도 값이 유지된다.
- 데이터 영역(Data Segment)에 저장된다.
- 접근 범위(Scope)는 선언된 위치에 따라 결정된다.
기본 문법
static 자료형 변수이름;
예시
static int Count = 0;
일반 지역 변수와 비교
일반 지역 변수
void Func()
{
int x = 0;
x++;
std::cout << x << std::endl;
}
호출
Func();
Func();
Func();
결과
1
1
1
함수가 호출될 때마다 새로 생성되고 함수가 끝나면 제거된다.
정적 변수
void Func()
{
static int x = 0;
x++;
std::cout << x << std::endl;
}
호출
Func();
Func();
Func();
결과
1
2
3
한 번만 생성되기 때문에 이전 값이 유지된다.
메모리 구조
void Func()
{
static int x = 0;
}
x는 함수 내부에 선언되어 있지만 스택 영역이 아닌 데이터 영역에 저장된다.
Data Segment
┌─────────┐
│ x = 0 │
└─────────┘
프로그램이 종료될 때까지 제거되지 않는다.
접근 범위 (Scope)
정적 변수는 수명(Lifetime)과 접근 범위(Scope)를 구분해서 생각해야 한다.
void Func()
{
static int x = 0;
}
수명
프로그램 시작
↓
생성
↓
프로그램 종료
↓
제거
접근 범위
Func 함수 내부에서만 접근 가능
즉,
void Func()
{
static int x = 0;
}
int main()
{
x = 10; // 오류
}
함수 밖에서는 사용할 수 없다.
정적 변수 사용 예시
함수 호출 횟수 세기
void Func()
{
static int Count = 0;
Count++;
std::cout << "호출 횟수 : "
<< Count
<< std::endl;
}
호출
Func();
Func();
Func();
결과
호출 횟수 : 1
호출 횟수 : 2
호출 횟수 : 3
일반 지역 변수와 정적 변수 비교
| 항목 | 지역 변수 | 정적 변수 |
|---|---|---|
| 생성 시점 | 함수 진입 | 프로그램 시작 |
| 제거 시점 | 함수 종료 | 프로그램 종료 |
| 저장 위치 | Stack | Data Segment |
| 값 유지 | ❌ | ⭕ |
| 접근 범위 | 선언된 블록 내부 | 선언된 블록 내부 |
정리
- 정적 변수는 프로그램 종료 시까지 메모리에 유지되는 변수이다.
- 한 번만 생성된다.
- 함수가 종료되어도 값이 사라지지 않는다.
- 데이터 영역(Data Segment)에 저장된다.
- 접근 범위는 선언된 블록 내부로 제한된다.
- 일반 지역 변수와 달리 이전 값이 유지된다.
- 함수 호출 횟수 저장, 상태 유지 등에 자주 사용된다.