끄적끄적

static 개념 본문

기타

static 개념

widruv 2016. 3. 26. 17:24
C에서의 static
  • 전역변수는 프로그램 어느 곳에서든 접근 가능
  • 그러나 지역변수에 static을 붙이면 전역변수의 특성을 지니면서 접근할 수 있는 범위에 제한을 둠

= static =
void func1()
{
     static int count = 0;
     printf( "%d\n", ++count );
}

int main()
{
     func1();
     // count = 10; 주석을 풀면 compile error
     func1();
     return 0;
}

결과값 
1
2

= 전역변수 =
int count = 0;
void func1()
{
         printf( "%d\n", ++count );
}

int main()
{
     func1();
     count = 10;
     func1();
     return 0;
}

결과값
1
11




C++ 에서의 static
  • C++ 에서는 전역이라는 개념 X
  • 전역변수와 전역함수를 일부 대체하기 위해 static 멤버 개념 등장

static 멤버
  • 일반적으로 클래스 변수, 클래스 함수라 불림
    • 객체 멤버가 아닌 클래스 내에 선언되어 모든 객체가 공유하고 있기 때문
    • 즉, 객체 단위가 아니라 클래스 단위로 사용되기 때문
  • main 함수 호출 이전에 메모리 공간에 올라가서 초기화 함 (전역변수와 동일)

static 멤버 변수
  • 반드시 int T::count와 같은 추가적인 선언이 필요함 안 그러면 Link error (헤더가 아닌 cpp에서 초기화 해줘야 함)
  • private에 선언되어 있으면 멤버 함수에서만 접근 가능
  • public이면 멤버 함수 및 다른 함수에서 직접 접근 가능
    • T::count = 3 이런식으로
  • 객체를 몇개를 만들든 오직 하나만 생성 됨
  • 일반 멤버 함수 및 static 멤버 함수에서 모두 접근 가능

static 멤버 함수
  • 일반 멤버 변수 접근 X
  • 일반 멤버 함수 호출 X
  • static 멤버 변수 사용 가능
  • 상속 X
  • 스레드에서 함수 사용 가능
  • public으로 선언하는 경우 전역에서 사용 가능
  • this 포인터의 사용 불가 (this 포인터는 객체가 생성되었을 때만 사용가능 하기 때문)

용도
  • 객체의 생성 없이 그 클래스의 일부 기능을 함수를 통해 제공할 때
  • 전체 프로그램에서 접근 가능해야 할 때
  • 클래스에서 딱 한번만 해야하는 초기화 (네트워크 연결, 윈도우 클래스 등록 등)을 해야 할 때
  • Singleton
  • 클래스에 공통적으로 사용되는 자원, 정보가 필요할 때
  • 일반 멤버 함수는 스레드용 함수로 호출이 안 되지만, static 멤버 함수는 스레드용 함수로 사용됨


class Count
{
private:
     int Value;
     static int Num;

public:
     Count() { Num++; }
     ~Count() { Num--; }

     static void OutNum() {
          printf("현재 객체 개수 = %d\n",Num); //인스턴스와 별개로 클래스가 관리하는 함수.
     }
};

int Count::Num = 0;

int main()
{
     Count::OutNum(); // 0
     Count aCount;
     aCount.OutNum(); // 1

     return 0;
}


'기타' 카테고리의 다른 글

프롬프트에서 날씨 정보 보기  (0) 2016.02.22
인터페이스 개념  (0) 2016.02.21
CallBack 함수  (0) 2016.02.09
Base 64 - 개요(1)  (0) 2016.01.07
Comments