본문 바로가기
Programming/C, C++

C++ Static 정적 클래스, 정적 멤버, static 변수, static함수

by Dev_카페인 2022. 12. 20.
반응형

[C++] Static 정적 클래스, 정적 멤버, static 변수, static함수

static 키워드는 4가지 유형으로 사용될 수 있다.

  1. 함수의 정적 변수 (Static variable in functions, static 변수)
  2. 정적 클래스 객체 (Static class objects, static 클래스)
  3. 클래스 내부의 정적 멤버 변수 (Static member variable in class, static 멤버 변수)
  4. 클래스 내부의 정적 함수 (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
}
반응형