본문 바로가기
C++

[C++]static 정적 변수와 Class

by Junk_Seo 2018. 2. 27.
반응형

static 정적 변수

static 정적 변수는 전역 변수의 성질과 namespace기능을 가진 변수입니다.

 

static 정적 변수는 2가지 성질을 가집니다.

1.static 정적 변수는 프로그램이 시작될 때 메모리를 잡습니다. 즉, 프로그램이 시작될 때 정적 변수가 생성되고 초기화되며 프로그램이 종료할 때까지 존재합니다. (전역 변수의 성질)

2. static 정적 변수는 선언된 지역(scope)에서만 사용이 가능합니다. (지역 변수의 성질)

 

<예제>

void func();

int main()
{
	func();
	func();
	func();
    return 0;
}

void func()
{
	static int nData = 0;
	nData++;
	printf("%d \n", nData);
}

func()라는 함수가 있습니다. 이 함수에는 static 정적변수 nData가 있고 이 nData의 값을 1 증가시킨 뒤 출력하는 함수입니다.

이 함수를 main에서 3번 호출하고 있습니다. '

 

이 프로그램을 실행시키면 출력은 다음과 같습니다.

위 사진과 같이 1 2 3을 출력하게 되는데 이 함수 안에 있는 static 정적변수 nData가 프로그램이 실행할 때 단 한 번 초기화되고 프로그램이 종료할 때까지 없어지지 않기 때문입니다. 

func() 함수 안에서 선언되었기 때문에 func() 함수 밖에서는 이 변수에 접근할 수 없습니다.

그리고 함수의 처음에 "static int nData = 0"을 통해 함수를 호출할 때마다 계속해서 static 정적변수를 초기화하는 것 같지만 이는 프로그램이 실행할 때 단 한 번 실행되고 다음부터는 실행되지 않습니다.

 

 

Class static 정적 멤버 변수

<예제>

class C_DATA
{
private:
	static int m_nData;

public:
	void setData(int nData);
	int getData();
};

int C_DATA::m_nData = 0;

int main()
{
	C_DATA cData1;
	cData1.setData(100);
	printf("%d \n", cData1.getData());

	C_DATA cData2;
	cData2.setData(50);
	printf("%d \n", cData1.getData());
    return 0;
}

void C_DATA::setData(int nData)
{
	m_nData = nData;
}

int C_DATA::getData()
{
	return m_nData;
}

위 코드에서 4행에서 class의 멤버로 static 정적변수 m_nData가 선언되어 있습니다.  그리고 11행에 "int C_DATA::m_nData = 0"이라는 코드가 있는데 이는 static 정적 변수인 m_nData를 초기화해 주기 위함입니다.

static 정적 변수의 경우 프로그램 시작과 동시에 메모리를 잡고 초기화를 해야 하는데, class의 경우는 객체를 생성해야 메모리를 잡기 때문에 class 안에서는 static 정적 변수를 초기화하는 것이 불가능합니다. 따라서 11행처럼 따로 초기화 코드가 추가되어야 합니다. 이를 추가하지 않으면 error가 발생합니다.

 

위 코드의 출력은 다음과 같습니다.

class 변수들은 static 정적 변수 하나를 공용으로 사용하는 형태를 취합니다. 즉, 하나의 class static 정적 변수를 여러 개의 class 변수가 공유하고 있는 형태입니다. 

따라서 한 class 변수에서 class static 정적 변수의 값을 변경하면 나머지 class 변수에서도 그 변경된 값을 사용합니다.

 

 

Class static 정적 멤버 함수

<예제>

class C_DATA
{
private:
	static int m_nData;

private:
	C_DATA();

public:
	static void setData(int nData);
	static int getData();
};

int C_DATA::m_nData = 0;

int main()
{
	C_DATA::setData(100);
	printf("%d \n", C_DATA::getData());
    return 0;
}

void C_DATA::setData(int nData)
{
	m_nData = nData;
}

int C_DATA::getData()
{
	return m_nData;
}

class static 정적 함수는 class static 정적 변수를 사용하기 위한 함수입니다.

10, 11 행을 보면 setData() 함수와 getData() 함수가 static으로 선언된 것을 볼 수 있습니다. 

이렇게 멤버 함수를 static으로 선언한 경우 18, 19행처럼 class 변수를 선언하지 않아도 namespace를 사용하여 함수를 직접 사용할 수 있게 됩니다.(static으로 선언하면 프로그램 시작과 동시에 메모리를 잡기 때문입니다.)

그리고 class를 static 멤버로 구성한 경우 class 변수를 생성하여 사용하는 것이 아닌 직접 접근으로 사용하기 위한 것이므로 7행처럼 생성자를 private로 하여 객체를 생성하지 못하게 막는다.

반응형