[C++] Static, 정적 변수


static 키워드는 c++ 언어에서 가장 혼동되는 키워드 중 하나이다. 사용되는 곳에 따라 다른 의미를 갖기 떄문이다.

static 키워드는 전역 변수에서 사용될 때 변수가 정의된 소스 파일 내에서 사용 가능함을 의미한다.

static 키워드는 블록 내에서 선언된 지역 변수에서도 사용할 수 있다. 지역 변수는 ‘자동주기’를 가져서 정의되는 시점에 생성되고 초기화되며, 블록이 끝나는 지점에서 소멸한다. 하지만 static을 사용한 지역변수는 다른 의미를 가지고 있다. static 키워드를 사용한 지역 변수는 ‘자동주기’ 에서 ‘정적주기’로 바뀐다. 이것을 정적 변수(static variable)라고도 부른다.

정적 변수는 생성된 스코프(범위)가 종료한 이후에도 해당 값을 유지하는 변수이다. 또한 정적 변수는 한 번만 초기화 되며 프로그램 수명 내내 지속된다.

#include <iostream>

void incrementAndPrint() {
  int value = 1; // 자동 주기
  ++value;
  std::cout << value << '\n';
} // value는 여기서 소멸된다.

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

결과로는 모두 2 2 2가 나온다.

아래의 코드를 보자.

#include <iostream>

void incrementAndPrint() {
  static int value = 1; // 정적 생명 주기. 이 줄은 한 번만 실행된다.
  ++value;
  std::cout << value << '\n';
} // value는 여기서 소멸되지 않지만, 접근할 수 없게 된다.

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

결과로는 2 3 4가 나온다.

정적 변수는 고유 식별자 생성기를 만들때 많이 사용된다. 프로그램 내에서 다수의 유사한 개체를 처리할 때 개체에 고유 ID 번호를 할당해서 식별하는 것이 유용한 경우가 많다.

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

출처: 항상 좋은 글들이 올라오는 소년코딩 블로그