본문 바로가기

강의자료/Class

001. 정적(static) 멤버변수와 멤버함수

◈ 이 글은 강의를 위하여 제가 직접 작성한 내용입니다. 따라서 퍼가실 경우, 출처를 명확히 해주시기 바랍니다!!
◈ This ariticle was written by me for teaching. So if you want to copy this article, please clarify the source!!


클래스에서 정적(static) 멤버변수와 정적 멤버함수의 역할을 이해하자.
// static 멤버변수 : 클래스의 모든 객체가 공유하게 되는 멤버변수.
// static 멤버함수 : static 멤버변수만 다룰 수 있는 멤버함수.
// ** static 변수는 모든 멤버함수가 다룰 수 있다.
// ** static 멤버변수와 멤버함수는 객체 생성없이 바로 호출 가능하다.

#include 
using namespace std;

int StaticFuncTest()
{
	static int num = 0;
	return num++;
}

class StaticClassTest
{
	int num;

public:
	static int static_member_num;

public:
	StaticClassTest() : num(0) {}

	int Value() 
	{
		return num++;
	}

	int StaticValue()
	{
		static int static_num = 0;
		return static_num++;
	}

	int StaticMemberValue()
	{
		return static_member_num++;
	}

	static int StaticMemberFunction()
	{
		// 스태틱 함수는 일반 멤버변수에 접근할 수 없다.
		// 오로지 스태틱 멤버변수에만 접근이 가능한다.
		return static_member_num;
	}
};

int StaticClassTest::static_member_num = 0;

void main()
{
	for(int i=0; i<10; i++)
	{
		cout << StaticFuncTest() << endl;
	}

	StaticClassTest test;
	StaticClassTest test2;

	cout << "StaticValue Func --------------------------" << endl;

	for(int i=0; i<10; i++)
	{
		cout << test.StaticValue() << endl;
		cout << test2.StaticValue() << endl;
	}

	cout << "StaticMemberValue Func --------------------------" << endl;

	for(int i=0; i<10; i++)
	{
		cout << test.StaticMemberValue() << endl;
		cout << test2.StaticMemberValue() << endl;
	}
	
	cout << "스태틱 멤버 변수 : " << StaticClassTest::static_member_num << endl;
	cout << "스태틱 멤버 함수 : " << StaticClassTest::StaticMemberFunction() << endl;

	// 아래코드는 당연히 사용가능.
	cout << "스태틱 멤버 변수 : " << test.static_member_num << endl;
	cout << "스태틱 멤버 함수 : " << test.StaticMemberFunction() << endl;
}

또 다른 예제 - 일반적인 활용 예
#include 
#include 

using namespace std;

// 미니 컴퓨터 클래스
class MiniComputer
{
public: 
	static string brand;
	static string cpu;
	int power;

public: 
	static string cpuSpeed()
	{
		return cpu;
	}
	static void setSpeed(string c)
	{
		cpu = c;
	}
	int getPower()
	{
		return power;
	}
	void setPower(int p)
	{
		power = p;
	}
};

// 클래스 데이터(static 멤버변수)는 꼭 외부에서 초기화를 해줘야 한다.
string MiniComputer::brand = "MBC Academy";
string MiniComputer::cpu = "2.4GHz";

int main()
{
	cout << "제조사명: " << MiniComputer::brand << endl;
	cout << "CPU 속도: " << MiniComputer::cpuSpeed() << endl;
	cout << endl;

	MiniComputer mini, mini2;
	mini.setPower(10);
	mini2.setPower(20);

	cout << "mini 파워 : " << mini.getPower() << endl;
	cout << "mini 제조사명: " << mini.brand << endl;
	cout << "mini CPU 속도: " << mini.cpuSpeed() << endl;
	cout << endl;

	cout << "mini2 파워 : " << mini2.getPower() << endl;
	cout << "mini2 제조사명: " << mini2.brand << endl;
	cout << "mini2 CPU 속도: " << mini2.cpuSpeed() << endl;
	cout << endl;

	MiniComputer::brand = "MBC Academy Digital Computer Art Institute of Education";
	MiniComputer::setSpeed("3.2GHz");
	mini.setPower(40);
	mini2.setPower(50);

	cout << "제조사명: " << MiniComputer::brand << endl;
	cout << "CPU 속도: " << MiniComputer::cpuSpeed() << endl;
	cout << endl;

	cout << "mini 파워 : " << mini.getPower() << endl;
	cout << "mini 제조사명: " << mini.brand << endl;
	cout << "mini CPU 속도: " << mini.cpuSpeed() << endl;
	cout << endl;

	cout << "mini2 파워 : " << mini2.getPower() << endl;
	cout << "mini2 제조사명: " << mini2.brand << endl;
	cout << "mini2 CPU 속도: " << mini2.cpuSpeed() << endl;
	cout << endl;

	return 0;
}

또 다른 예제 - 10개의 객체를 생성하여 확인
#include 
#include 

using namespace std;

class Counter
{
private:
	static int count;
	int my_count;

public:
	Counter()
	{
		count++;
		my_count = count;
	}
	~Counter()
	{
		count--;
	}

	static int GetCount()
	{
		return count;
	}

	static void ShowNowCounter()
	{
		cout << "Counter's object number is " << count << endl;
	}

	void ShowMyCounter()
	{
		cout << "My number is " << my_count << endl;
	}
};

int Counter::count = 0;

void main()
{
	Counter* ary[10] = {0,0,0,0,0,0,0,0,0,0};

	for(int i=0; i<5; i++) 
	{
		ary[i] = new Counter;
		Counter::ShowNowCounter();
	}	

	for(int i=0; iShowMyCounter();
	}

	for(int i=0; i<10; i++) 
	{
		delete ary[i];
		Counter::ShowNowCounter();
	}
}