static keyword에 대해서

Min·2024년 7월 14일
0

CPP

목록 보기
14/14
post-thumbnail

static

static 키워드는 굉장히 다양한 곳에서 사용됩니다. 지역변수에 붙기도 하고, 전역변수에 붙기도 하며, 멤버변수에도 붙을 수 있고, 심지어 멤버 함수에 붙을 수 도 있습니다. 어떻게 사용되냐에 따라서 조금씩 다른 동작을 하기 때문에 static 키워드를 하나로 아우르는 적당한 설명이 없을까에 대해서 생각을 해봤습니다.

기본적으로 static 변수는 데이터 영역에 저장되며, 컴파일 타임에 초기화 됩니다.

사용하는 영역, 메모리가 할당되고 해제되는 타이밍은 전역변수와 같습니다. 다만, 같은 파일 내부에서라면 어디서든 접근이 가능한 전역 변수와는 다르게, static 변수는 데이터에 접근하는 것이 일부 제한됩니다.

static 키워드가 붙은 변수나 함수는, 선언된 scope와 바인딩됩니다.

  1. 지역 static 변수 : 선언된 Local Stack(scope)에서만 접근이 가능하며, 반복해서 들어와도 최초 한번만 초기화 됩니다.
  2. 전역 static 변수 : 선언된 file(scope)에서만 접근이 가능합니다. 다른 파일에 같은 이름의 전역 변수가 있더라도 선언된 file(scope)과 바인딩 되기 때문에, 컴파일러 입장에서도 모호성이 사라집니다.
  3. static 멤버 변수 : 특정 인스턴스와 바인딩 되는 것이 아니라 선언된 class(scope)와 바인딩 되는 멤버변수입니다.
  4. 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에 고정시키는 키워드!
이것은 제 주관적인 생각으로, 틀릴 수도 있으니 참고만 하시기 바랍니다.

profile
티내는 청년

0개의 댓글