Notice
Recent Posts
Recent Comments
끄적끄적
static 개념 본문
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--; }
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