ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • static 변수 특징
    쥬신게임아카데미/C++ 2016. 1. 6. 16:16

    초기값을 주지 않을 경우 항상 0으로 초기화되고

    프로그램을 실행시킬 때 단 한번만 초기화 된다.(초기값이 있든지 없든지 상관없고..없으면 0으로 한번만..)

     

    아래의 상황을 고려해서 사용여부 결정

    1. 클래스 설계시 멤버 변수 중에 모든 인스턴스에서 공통으로 사용해야 하고 상태 값이 변경되지 않는 경우에는 static 변수 사용

    2. 클래스 설계시 메소드 중 내부의 인스턴스 변수를 사용하지 않는 것은 static메소드 사용

     

    C/C++

    C 프로그래밍 언어는 static, auto, register, extern 4개의 storage class - 여기에서 객체의 클래스가 아닌 집합의 의미를 가진다 - 를 가진다.
    1. static global variable
      • 소스파일의 최상의 레벨에서 함수외부에 선언되는 static 변수.
      • 프로그램이 시작할 때 할당되고 종료할 때까지 유지된다.
      • static으로 선언된 변수는 선언된 소스코드 파일에 고정되므로, 다른 파일에서 동일한 이름의 static 변수가 선언될 수 있다. 물론 이들 변수는 파일별로 독립적으로 사용된다.
    2. static local variable
      • 함수안에서 선언되는 static 변수로 automatic local variables (자동지역변수)와 같은 scope를 가진다.
      • 함수가 호출될때 할당되고 함수가 반환할때 소멸된다.
    3. static 변수값 초기화. static으로 선언된 변수들은 고유의 값으로 초기화된다.
      데이터형 초기화 값 비고
      int 0
      char \0
      pointer NULL
      float 0.0
      double 0.0
      bool 0 C의 경우 C99에서 지원
    4. static member variable
      • C++에서는 멤버변수를 static 멤버변수로 지정할 수 있다. static 으로 선언된 멤버변수는 모든 클래스 인스턴스가 서로 공유한다.
    5. static method
      • C++은 메서드를 static로 선언하는게 가능하다. static로 선언한 메서드는 클래스의 인스턴스가 없어도 사용할 수 있다.

     

     


    정적 변수는 변수가 소멸되지 않고 계속 남아있는 측면에서는 외부변수와 차이가 없지만 정적 변수에는 전역/지역의 개념을 가진다는 점이 외부변수와의 차이점입니다.

    정적 변수는 함수 내부에서 선언하면 지역변수가 되고 함수 외부에서 선언하면 전역 변수가 됩니다.

    정적 변수는 자동변수나 레지스터 변수가 블록을 빠져 나갈 때마다 초기화 되는 반면에 정적 변수의 값은 소멸되지 않고 다시 해당 블록으로 돌아왔을 때 기존의 값에 누적한다는 점이 다릅니다.

    u 정적 변수의 특징

    키워드: static

    유효범위: 변수가 선언된 블록 내부

    블록 내에서는 기존의 값을 그대로 보존합니다.

    초기화는 자동적으로 이루어집니다.

    문자인 경우에는 null 정수 형인 경우는 0, 실수 형인 경우는 0.0으로 초기화 됩니다.

     

    static 멤버 변수의 또 하나의

    특징은 객체가 선언되지 않아도 사용할 수 있다는 것이다. 단 public 멤버에 한해서만 가능하다.

     

     


    class T
    {
    public:
        static int count;

        int value;
        T() { printf( "count = %d \n", ++count ); }
        static void func() { printf( "%d", value ); }

    };

     

    int  T::count;      // 매우 중요

     

    void main( void )
    {
        T t1;
        T t2;
    }

     

    위 코드는 다음과 같은 컴파일 에러를 발생시킨다.

     

    Compiling...
    t2.cpp
    c:\gsi\temp\t1\t2.cpp(11) : error C2065: 'value' : undeclared identifier
    Error executing cl.exe.


     

    T클래스에 정의되어 있는 value 함수에 접근하고자 할 때, value 변수에 대해 생뚱맞다게도

    선언되지 않은 정의자(undeclared identifier) 에러가 발생한다. 이쯤 되면 같은 클래스가

    아닌가 하는 의심이 들 정도다. 맞다. static멤버 함수는 T형 클래스 안에 선언되어 있지만

    실제로는 껍데기만 T클래스일 뿐이며, 다른 클래스 일반 함수들과 전혀 다르게 동작한다.

     

    클래스 내에 선언되어 있는 static 함수는 오직 static 멤버 변수에만 접근이 가능하다.

     

     


    일반 멤버 변수 및 멤버 함수static 멤버 변수와 멤버함수에 대한 특징을 정리하자.

     

    일반 멤버 변수

    . 객체가 생성될 때마다 객체의 수만큼 생성된다.

    . 일반 멤버 변수를 객체의 생성 없이 직접 접근할 없다.

    . static 멤버 함수에서 접근할 수 없다.

    .일반 멤버 함수에서 접근할 수 있다.

     

    일반 멤버 함수

    . 객체가 생성되지 않아도 함수는 먼저 생성되어 있다.

    . 함수 객체마다 하나씩 생성되는 것이 아니며, 오직 하나만 생성된다. 각 객체는 함수를 공유하여 사용하는

      것 뿐이다.

    . 스레드에서 호출될 수 없다.

    . static 멤버 함수를 호출할 수 있다.

    . 상속할 수 있다.

    . this 포인터의 사용이 가능하다.

     

    static 멤버 변수

    . 객체의 생성과 관계 없이 생성되며, 객체에서 사용하는 전역 변수라고 생각하면 된다.

    .반드시 int  T::count;와 같은 추가적인 선언이 필요하다. 그렇지 않은 경우 LINK에러가 발생된다.

    . private 영역에 선언되어 있으면, 멤버 함수에서만 접근 가능하고, public 영역에 선언되어 있으면,

      멤버 함수다른함수에서 직접 접근할 수 있다.

    . 객체가 사용하는 전역 변수이기 때문에 오직 하나만 생성된다. 객체 변수들은 객체가 생성될 때마다

     만들어 진다.

    . 일반 멤버 함수static 멤버 함수에서 모두 접근 가능하다.

     

    static 멤버 함수

    . 일반 멤버 변수를 접근할 수 없다.

    . 일반 멤버 함수를 호출할 수 없다.

    . static 멤버 변수를 사용할 수 있다.

    . 상속할 수 없다.

    . 스레드에서 함수 사용 가능하다.

    . public 영역에 선언되는 경우 전역에서 사용 가능하다.

    . this 포인터의 사용이 불가능하다. this 포인터는 객체가 생성되었을 때만 사용할 수 있기 때문이다.

      (객체가 없을 때 호출될 있는 static 멤버 함수가 객체 포인터(this)에 접근하는 것은 당연히 불가능)

     

     

     

    static 멤버 함수특별한 경우에 사용되는데, 그 용도를 살펴보자.

     

    -객체의 생성 없이 그 클래스의 일부 기능을 함수를 통해 제공할 때 사용한다.

    -일반 멤버 함수는 스레드용 함수로 호출이 안되지만, static 멤버함수는 스레드용 함수로 사용된다

Designed by Tistory.