static 키워드는 굉장히 다양한 곳에서 사용됩니다. 지역변수에 붙기도 하고, 전역변수에 붙기도 하며, 멤버변수에도 붙을 수 있고, 심지어 멤버 함수에 붙을 수 도 있습니다. 어떻게 사용되냐에 따라서 조금씩 다른 동작을 하기 때문에 static 키워드를 하나로 아우르는 적당한 설명이 없을까에 대해서 생각을 해봤습니다.
사용하는 영역, 메모리가 할당되고 해제되는 타이밍은 전역변수와 같습니다. 다만, 같은 파일 내부에서라면 어디서든 접근이 가능한 전역 변수와는 다르게, static 변수는 데이터에 접근하는 것이 일부 제한됩니다.
- 지역 static 변수 : 선언된 Local Stack(scope)에서만 접근이 가능하며, 반복해서 들어와도 최초 한번만 초기화 됩니다.
- 전역 static 변수 : 선언된 file(scope)에서만 접근이 가능합니다. 다른 파일에 같은 이름의 전역 변수가 있더라도 선언된 file(scope)과 바인딩 되기 때문에, 컴파일러 입장에서도 모호성이 사라집니다.
- static 멤버 변수 : 특정 인스턴스와 바인딩 되는 것이 아니라 선언된 class(scope)와 바인딩 되는 멤버변수입니다.
- static 멤버 함수 : class(scope)와 바인딩된 함수입니다.
#include <iostream>
static int a = 1;
int main()
{
int* GlobalStaticPtr = &a;
std::cout << (__int64)(GlobalStaticPtr) << std::endl;
//140697527173120
int& g_a = a;
static int a = 2;
int* MainLocalStaticPtr = &a;
std::cout << (__int64)(MainLocalStaticPtr) << std::endl;
//140697527173124
{
static int a = 0;
int* InnerLocalStaticPtr = &a;
std::cout << (__int64)(InnerLocalStaticPtr) << std::endl;
//140697527173632
}
MainLocalStaticPtr = &a;
std::cout << (__int64)(MainLocalStaticPtr) << std::endl;
//140697527173124
GlobalStaticPtr = &g_a;
std::cout << (__int64)(GlobalStaticPtr) << std::endl;
//140697527173120
return 0;
}
static keyword는 선언된 scope에 고정시키는 키워드!
이것은 제 주관적인 생각으로, 틀릴 수도 있으니 참고만 하시기 바랍니다.