COMPUTING

[MSDN] Static(C++) 키워드 정의, 기능

Exeter 2015. 10. 15. 23:31
반응형


- 본 글은 C/C++에서 사용되는 static 키워드에 대하여 스터디 차원에서 MSDN에서 찾은 자료를 번역 한 것입니다. 일부 번역이 애매한 중요한 키워드는 영문으로 유지하였습니다. 이탤릭체는 부가적인 설명으로 개인 의견입니다.

- 본인은 C/C++ 초급자로 본글에는 오류가 포함될 수 있습니다. 의견이나 틀린 부분은 댓글로 부탁드립니다.




static 키워드는 변수, 함수, 클래스 데이터 멤버와 클래스 함수를 선언하는데 사용될 수 있다.


기본적으로, 모든 블럭의 외부에서 정의된 객체나 변수는 static duration과 external linkage 특성을 갖는다. Static duration은 객체나 변수가 프로그램이 시작할 때 할당되고 프로그램이 종료될 때 할당이 해제(소멸)되는것을 의미한다. External linkage는 어떤 변수가 선언된 파일의 외부에서도 변수의 이름이 visible하다는 것을 의미한다. 반대로, internal linkage는 변수가 선언된 파일의 외부에서는 visible하지 않다는 것을 의미한다.


static 키워드는 다음과 같은 상황에서 사용될 수 있다.

  • 파일 범위에서 변수나 함수를 선언하는 경우(전역 또는 네임스페이스 범위), static 키워드는 이 변수나 함수가 internal linkage를 갖도록 지정한다. 변수를 선언할때, 변수는 static duration을 갖고, 특정 값을 지정하지 않는한 컴파일러는  변수를 0값으로 초기화 한다.
    *주 : 따라서 static으로 선언된 전역 변수나 함수의 경우에는 외부 파일에서는 접근할 수 없습니다. 또한 static 변수는 자동으로 0값으로 초기화가 됩니다.
    • 함수내에서 변수를 선언할때, static 키워드는 함수의 다수의 호출시에도 그 상태를 유지하도록 지정한다.  
      *주 : 함수내의 지역 변수임에도 불구하고, 값이 계속 유지 된다는 의미 같습니다
    • 클래스 선언에서 데이터 멤버를 선언(declare)하는 경우, static 키워드는 멤버의 하나의 복사본이 클래스의 모든 인스턴스에서 공유되는 것을 명시한다. 정적 데이터 멤버는 파일 범위에서 정의(define) 되어야 한다.  const static 으로 선언되는 정수 계열 데이터 멤버(integral data member)는 initializer를 가질 수 있다

    *주1 : Integral data member ; char, int, unsigned int 등과 같은 정수형 타입을 의미함
    *주2 : 예를들어, const static int 타입과 같은 경우에는 클래스 내부에서 초기화를 할 수 있습니다, 

        하지만 const static double 타입의 경우에는 클래스 밖에서 초기화 해야 합니다.

    -> 이유는 모르겠네요. 왜 이러한 규칙이 합당(?)한지 이유를 아시는 분은 댓글 부탁드립니다. 


    • 클래스 선언에서 멤버 함수를 선언(declare)하는 경우, static 키워드는 함수가 클래스의 모든 인스턴스에서 공유되는 것을 명시한다. 정적 멤버 함수는 인스턴스 멤버에 접근할 수 없는데, 이는 함수가 내부적으로 this 포인터를 갖지 않기 때문이다. 인스턴스 멤버에 접근하기 위해서는, 인스턴스 포인터나 레퍼런스인 파라미터를 갖는 함수를 선언하라.
    *주1 : static bool isReady(); 와 같은 함수의 경우 '객체'의 멤버 변수에 접근할 수 없습니다. 정적 멤버 함수의 경우 객체의 생성없이 클래스명::함수명() 과 같은 형식으로 사용 가능합니다.

    • 공용체(union)의 멤버를 static으로 선언할 수 없다. 그러나 전역으로 선언된 익명의 공용체는 명시적으로 static으로 선언되어야 한다.
    -> 불행히도, union 부분은 제가 지식이 전무합니다... 이해 불가.



    아래는 원글에 있는 샘플 코드 중 하나만 복사했습니다. 원글에서 몇가지 샘플코드를 참고하세요.


    The following example shows the use of static in a class.

    // static2.cpp
    // compile with: /EHsc
    #include <iostream>
    
    using namespace std;
    class CMyClass {
    public:
       static int m_i;
    };
    
    int CMyClass::m_i = 0;
    CMyClass myObject1;
    CMyClass myObject2;
    
    int main() {
       cout << myObject1.m_i << endl;
       cout << myObject2.m_i << endl;
    
       myObject1.m_i = 1;
       cout << myObject1.m_i << endl;
       cout << myObject2.m_i << endl;
    
       myObject2.m_i = 2;
       cout << myObject1.m_i << endl;
       cout << myObject2.m_i << endl;
    
       CMyClass::m_i = 3;
       cout << myObject1.m_i << endl;
       cout << myObject2.m_i << endl;
    }
    
    0
    0
    1
    1
    2
    2
    3
    3


    -설명 

    1. static으로 선언된 멤버변수(m_i)의 경우에는 모든 인스턴스에서 공유하게 됩니다. 

    따라서 myObject1과 myObject2에서 동일한 값을 출력하고 있습니다.

    2. static 멤버 변수는 클래스 외부에서 초기화 해야 합니다. 

    위 소스코드에서도 int CMyClass::m_i = 0; 로 초기화하고 있습니다.



    반응형