소년코딩

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';
} // value는 여기서 소멸된다.

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; // 'static' 키워드를 사용한 '정적 생명 주기', 이 줄은 한번만 실행된다.
    ++s_value;
    std::cout << s_value << '\n';
} // s_value는 여기서 소멸되지 않지만, 접근할 수 없게된다.

int main()
{
    incrementAndPrint();
    incrementAndPrint();
    incrementAndPrint();
}

program outputs:

2
3
4

위 프로그램에서 s_valuestatic으로 선언되었기 때문에 s_value는 한 번만 생성되고 1로 초기화된다. 스코프(=범위)를 벗어나면 소멸하지 않는다. incrementAndPrint() 함수가 호출될 때마다 s_value 값은 이전에 남겨둔 값이다.

g_를 사용하여 전역 변수에 접두어를 지정하는 것처럼 s_를 사용하여 정적 변수에 접두사를 지정하는 것이 일반적이다.

정적 변수의 가장 일반적인 용도 중 하나는 고유 식별자 생성기다. 프로그램 내에서 다수의 유사한 개체를 처리할 때 각 개체에 고유 ID 번호를 할당하여 식별하는 것이 유용한 경우가 많다. 정적 변수를 사용하면 이 작업을 쉽게 수행할 수 있다.

int generateID()
{
    static int s_itemID = 0;
    return s_itemID++; // s_isemID의 복사본을 만들고, 실제 s_isemID를 증가시킨 다음 복사본의 값을 반환한다.
}

이 함수가 처음 호출될 때 0을 반환(return)한다. 두 번째로 1을 반환한다. 호출될 때마다 호출 이전보다 1 더 큰 값을 반환한다. s_itemID는 지역 변수이므로 다른 함수가 "변경"할 수 없다.

정적 변수는 지역 변수와 같은 스코프(=범위)를 가지면서 전역 변수의 이점을 제공한다. (프로그램이 끝날 때까지 소멸하지 않는다.) 이 특성은 전역 변수를 사용하는 것보다 훨씬 안전하다.


cpp 번역: 이 포스트의 원문은 http://www.learncpp.com/cpp-tutorial/43-static-duration-variables/ 입니다.

댓글 로드 중…

블로그 정보

소년코딩 - 소년코딩

소년코딩, 자바스크립트, C++, 물리, 게임 코딩 이야기

최근에 게시된 이야기