모든 객체는 생성될때 생성자를 호출, 파괴될때 소멸자를 호출하게된다.
따라서 객체의 개수를 관리할 변수가 필요할 때가 있고 객체가 몇개 생성되었는지 개수를 알고싶다면
생성자에서 변수값을 +1, 소멸자에서 변수값을 -1 하면된다.
전역변수를 사용해서 객체의 개수를 관리하면, 전역변수는 메모리에 하나만 있고 모든 객체가 공유하게 되어 객체의 개수를 구할 수 있다.
하지만 이 경우 외부에서 수정이 가능하기 떄문에, member data로 사용하는데 대신에 static으로 선언하게된다.
정적 멤버 데이터(static member data)
static이 붙은 멤버 데이터. 멤버이므로 접근 지정자를 사용할 수 있다.
모든 객체가 공유한다.
클래스 내부에 선언을 만들고 클래스 외부에 정의를 만들어야 한다.
정적 멤버 데이타는 객체가 없어도 메모리에 놓인다.
class Car
{
int speed;
int color;
static int cnt; //선언
public:
Car() {++cnt;}
~Car() {--cnt;}
int getCount() { return cnt;}
};
int Car::cnt = 0; //정의
객체 이름을 사용하거나 클래스 이름을 사용해서 접근할 수 있지만, static일 경우는 클래스 이름을 사용해서 접근 하는 것이 가독성이 더 좋다.
외부 정의 | 멤버 필드 초기화 | |
non static member data | X | O |
static member data | O | X |
static const 정수계열 | X | O |
static const 비정수계열 | O | X |
static constexpr | X | O |
inline static | X | O |
+) 멤버필드 초기화란, 클래스내에서 선언 즉시 같이 초기화 하는것. Ex) static const int sdata2 = 0;
inline은 C++17이상부터 사용가능.
정적 멤버 함수 (static member function)
객체가 없더라도 함수를 불러야하는 경우가 생길 경우
클래스이름::함수이름() 으로 호출한다.
객체 없이 호출 가능한 멤버 함수.
일반 멤버에 접근할 수 없고 정적멤버에만 접근할 수 있다.
class Car
{
int speed;
static int cnt;
public:
Car() {++cnt;}
~Car() {--cnt;}
static int getCount() { return cnt;}
};
int Car::cnt = 0; //
int main()
{
// 자동차 갯수를 알고 싶다.
// getCount() 호출
Car::getCount();
Car c1, c2, c3;
c1.getCount();
}
일반멤버함수 vs 정적멤버함수
일반 멤버함수는 각각의 객체에 대한 개별연산
정적 멤버함수는 모든 객체의 공통에 대한 연산
'프로그래밍 > C++' 카테고리의 다른 글
[C++] this 포인터 개념 (0) | 2021.08.20 |
---|---|
[C++] 상수 멤버 함수 const member function (0) | 2021.08.20 |
[C++] 복사생성자 (0) | 2021.08.19 |
[C++] 포인터와 레퍼런스 (0) | 2021.08.18 |
[C++] range for, if init, switch init (0) | 2021.07.25 |