C 언어 | 구조체 선언 | 정적 변수 - static
일반 로컬 변수는 함수가 종료되면 값을 없어지지만 static 지정자를 이용한 정적 변수는 영구적인 수명을 가지고 있다. 함수 내에서만 사용하는 로컬 변수이면서, 글로벌 변수와 마찬가지로 응용 프로그램이 종료될 때까지 변수의 값을 계속 유지한다.
영구 로컬 변수
일반적으로 함수 안에서 선언된 함수는 로컬 수명을 가진다. 그것은 함수가 실행될 때에 초기화되어 함수가 제어를 돌려줄 때에 개방된다는 것이다. 이것은 함수가 계산을 수행하는데 필요한 일시적인 저장 영역에 적합하다.
그러나, 때로는 프로그램은 더 복잡한 장기 처리를 요청할 수 있다. 예를 들어, 함수가 여러번 호출되었는지를 저장해야 한다는 요구가 주어진다면 어떻게 해야 할까? 함수의 참조 횟수를 세는 것에는 그 함수 내부에서 전용으로 카운터 변수를 증가하는 방법이 가장 확실하지만 문제는 이 변수의 기억 클래스이다.
자동 변수라면, 함수가 종료할 때 정보가 손실되어 버린다. 이것으로는 자신이 몇 번 호출되고 있는지를 관리할 수 없기 때문에 전역 변수로 카운터를 사용하는 것을 생각할 것이다. 그러나 전역 변수는 다른 함수에서 잘못된 값을 변경되어 버릴 가능성이 있다. 함수가 이 전역 변수를 사용하여 참조 횟수를 세어서 정말 그 값이 정확한지는 보장할 수 없다.
그래서 정적 변수를 사용한다. 정적 변수는 자동 변수와 달리 영구적인 수명을 가지고 있다. 즉, 전역 변수처럼 프로그램의 시작시에 초기화되며 프로그램이 종료할 때까지 값을 유지하는 것이다. 함수의 내부 변수를 정적 변수로 선언하여 함수가 종료되도 해제되지 않은 변수를 만들 수 있다. 게다가, 이 변수의 가시성은 자동 변수와 같고, 다른 함수에서 액세스할 수 없다. 정적 변수를 선언하려면 static 지정자를 사용한다.
static 지정자
static 형 변수명 ...
이와 같이 변수를 선언하면, 이 변수는 글로벌 수명을 가지게 된다. 함수 내부에서 선언된 경우는 함수가 종료되어도 변수가 파기되는 것은 아니다. 함수의 외부, 즉 외부 레벨에서 선언된 경우에 대해서는 “외부 레벨 선언"에서 자세히 소개한다.
코드1
#include <stdio.h>
void ShowCount(void) {
static int iCount = 0;
printf("iCount = %d\n" , iCount++);
}
int main() {
ShowCount();
ShowCount();
ShowCount();
return 0;
}
코드1의 ShowCount() 함수는 이 함수의 참조 횟수를 표시한다. 함수의 참조 횟수를 기억하기 위해서 함수 내부에서 static 기억 클래스를 가진 숫자 변수 iCount을 선언하고 있다. 보통의 변수는 함수가 호출될 때마다 초기화되어 버리지만, 이 변수는 static을 가진 정적 변수이므로 초기화는 한번 밖에 수행되지 않는다. 실행 결과에서 확인할 수 있듯이 함수를 호출마다 정적 변수 iCount 증가하여 참조 횟수를 정확하게 저장하고 있다.
static을 지정한 정적 변수는 이 밖에도 초기화의 부담을 완화하는 수단으로 이용된다. 항상 같은 값을 나타내는 변수의 경우는 함수를 실행할 때마다 초기화하는 오버 헤드를 피할 수 있을 것이다. 항상 같은 문자열을 나타내는 char 형배열 등에 유효하다.