반응형
[C++] Static 정적 클래스, 정적 멤버, static 변수, static함수
static 키워드는 4가지 유형으로 사용될 수 있다.
- 함수의 정적 변수 (Static variable in functions, static 변수)
- 정적 클래스 객체 (Static class objects, static 클래스)
- 클래스 내부의 정적 멤버 변수 (Static member variable in class, static 멤버 변수)
- 클래스 내부의 정적 함수 (Static methods in class, static 멤버 함수)
- static변수는 처음 실행할 때 딱 한 번 초기화 된다.
- 프로그램 시작시 할당되고 종료시 해제된다.
함수의 정적 변수 (Static variable in functions, static 변수)
- 프로그램 시작시 할당되고 종료시 해제되기 때문에 값이 유지가 된다.
- 초기화 구문은 한 번만 실행하기 때문에 값이 0으로 되돌아가지 않는다.
#include <iostream>
using namespace std;
void StaticCount()
{
// 중단점을 찍어보면 한 번만 실행한다는 것을 알 수 있다.
static int count = 0; // 한 번만 초기화 됌
cout << count++ << endl;
}
int main()
{
StaticCount(); // 0
StaticCount(); // 1
StaticCount(); // 2
}
정적 클래스 객체 (Static class objects, static 클래스)
- 해당 지역 {중괄호} 범위를 벗어나도 소멸하지 않는다.
#include <iostream>
using namespace std;
class StaticObject
{
public :
StaticObject()
{
count = 0;
cout << "생성자 호출" << count << endl;
}
~StaticObject()
{
cout << "소멸자 호출" << endl;
}
void CountUP()
{
count++;
cout << "Count : " << count << endl;
}
private :
int count;
};
void CallStaticObjectClass()
{
static StaticObject _StaticObject; // 생성자를 또 호출하지 않는다.
_StaticObject.CountUP();
}
int main()
{
{
CallStaticObjectClass(); // 해당 지역이 끝나도 소멸자는 호출되지 않는다.
}
CallStaticObjectClass();
CallStaticObjectClass();
}
// Result
// 생성자 호출 0
// 1
// 2
// 3
// 소멸자 호출
클래스 내부의 정적 멤버 변수 (Static member variable in class, static 멤버 변수)
- 클래스 안에 있는 static 변수는 클래스 외부에서 초기화 시켜줘야 한다.
- 생성된 객체는 달라도 static 메모리는 공유한다.
#include <iostream>
using namespace std;
class StaticObject
{
public :
StaticObject(string name) { this->name = name; }
~StaticObject() {}
void CountUP()
{
count++;
cout << name << " Count : " << count << endl;
}
private :
string name;
static int count;
};
int StaticObject::count = 0; // static 멤버 변수는 클래스 외부에서 초기화
int main()
{
StaticObject ClassA("ClassA");
StaticObject ClassB("ClassB");
ClassA.CountUP(); // ClassA Count : 1
ClassB.CountUP(); // ClassB Count : 2
ClassA.CountUP(); // ClassA Count : 3
ClassB.CountUP(); // ClassB Count : 4
}
클래스 내부의 정적 함수 (Static methods in class, static 멤버 함수)
- static함수 내부에서는 static으로 선언된 것만 사용가능하다.
- static이 아닌 멤버들이 할당되기 전에 호출될 수 있기 때문에 사용이 불가
#include <iostream>
using namespace std;
class StaticObject
{
public :
StaticObject() {}
~StaticObject() {}
static void CountUP()
{
count++;
cout << " Count : " << count << endl; // name은 static이 아니라 사용 불가
}
private :
string name;
static int count;
};
int StaticObject::count = 0;
void Function()
{
StaticObject::CountUP(); // 2
}
int main()
{
StaticObject::CountUP(); // 1
Function();
StaticObject::CountUP(); // 3
}
반응형
'Programming > C, C++' 카테고리의 다른 글
C++ 최대 값, 최소 값 (max_element, min_element) (0) | 2023.09.15 |
---|---|
C++ 자주 사용되는 문법 (0) | 2023.09.15 |
C++ 구조체와 클래스의 코드로보는 차이점 (0) | 2022.12.20 |
C++ 바이트 패딩 (Byte Padding) (0) | 2022.12.14 |
C++ 구조체 (structure type) (0) | 2022.12.14 |