04.05 - static, 정적 변수
static
키워드는 C++ 언어에서 가장 혼동되는 키워드 중 하나다. 어디에서 사용되는지에 따라 다른 의미를 지니기 때문이다.
포스트 '04.03 - 전역 변수' 에서 static
키워드가 전역 변수에서 사용될 때 '내부 연결 속성'을 적용한다는 것을 알았다. 즉, 변수가 정의된 소스 파일 내에서 사용 가능함을 의미한다.
static
키워드는 블록 내에서 선언된 지역 변수에서도 사용할 수 있다. 지역 변수는 '자동 주기(auto duration)'를 가지며, 정의되는 시점에서 생성되고 초기화되며, 정의된 블록이 끝나는 지점에서 소멸한다. static
키워드를 사용한 지역 변수는 완전히 다른 의미가 있다. static
키워드를 사용한 지역 변수는 '자동 주기(auto duration)'에서 '정적 주기(static duration)'로 바뀐다. 이것을 정적 변수(static variable)라고도 부르는데, 생성된 스코프(=범위)가 종료한 이후에도 해당 값을 유지하는 변수다. 또한, 정적 변수는 한 번만 초기화되며 프로그램 수명 내내 지속된다.
예제:
#include <iostream>
void incrementAndPrint()
{
int value = 1;
++value;
std::cout << value << '\n';
}
int main()
{
incrementAndPrint();
incrementAndPrint();
incrementAndPrint();
}
program outputs:
2
2
2
incrementAndPrint()
함수를 호출할 때마다 value
변수가 생성되고 값 1이 할당된다. 그다음 incrementAndPrint()
함수는 값을 2로 증가시킨 value
변수값 2를 출력한다. incrementAndPrint()
함수의 실행이 완료되면 value
변수는 스코프(=범위)를 벗어나 소멸한다.
이제 위 프로그램의 '정적 생명 주기'를 고려해보자. 위 프로그램과 아래 프로그램의 유일한 차이점은 static
키워드를 사용해서 지역 변수값을 '자동 생명 주기'에서 '정적 생명 주기'로 변경했다는 것이다.
#include <iostream>
void incrementAndPrint()
{
static int s_value = 1;
++s_value;
std::cout << s_value << '\n';
}
int main()
{
incrementAndPrint();
incrementAndPrint();
incrementAndPrint();
}
program outputs:
2
3
4
위 프로그램에서 s_value
는 static
으로 선언되었기 때문에 s_value
는 한 번만 생성되고 1로 초기화된다. 스코프(=범위)를 벗어나면 소멸하지 않는다. incrementAndPrint()
함수가 호출될 때마다 s_value
값은 이전에 남겨둔 값이다.
g_
를 사용하여 전역 변수에 접두어를 지정하는 것처럼 s_
를 사용하여 정적 변수에 접두사를 지정하는 것이 일반적이다.
정적 변수의 가장 일반적인 용도 중 하나는 고유 식별자 생성기다. 프로그램 내에서 다수의 유사한 개체를 처리할 때 각 개체에 고유 ID 번호를 할당하여 식별하는 것이 유용한 경우가 많다. 정적 변수를 사용하면 이 작업을 쉽게 수행할 수 있다.
int generateID()
{
static int s_itemID = 0;
return s_itemID++;
}
이 함수가 처음 호출될 때 0을 반환(return)한다. 두 번째로 1을 반환한다. 호출될 때마다 호출 이전보다 1 더 큰 값을 반환한다. s_itemID
는 지역 변수이므로 다른 함수가 "변경"할 수 없다.
정적 변수는 지역 변수와 같은 스코프(=범위)를 가지면서 전역 변수의 이점을 제공한다. (프로그램이 끝날 때까지 소멸하지 않는다.) 이 특성은 전역 변수를 사용하는 것보다 훨씬 안전하다.
번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/43-static-duration-variables/ 입니다.