본문 바로가기

C++/C++ 문법

[C++] 객체 내에서 static 변수, static 멤버함수

728x90
반응형

객체 내에서 staitc 지역변수

 

static 변수를 클래스 안에서 선언할 수도 있다.

 

static 변수는 객체를 생성할 때마다 각 개체에 부여되는 것이 아니라 프로그램이 시작할 때부터 메모리가 할당되며

객체와 독립적으로 존재한다.

 

또한 모든 객체가 같은 static 변수를 공유한다.

 

다음 코드를 통해 이를 확인할 수 있다.

 

#include <iostream>
using namespace std;

class testclass {
private:
	static int num;
public:
	testclass() {
		num++;
	}
	void shownum() {
		cout << "num : " << num << endl;
	}
};
int testclass::num = 0;

int main()
{
	testclass test1;
	test1.shownum();
    
	testclass test2;
	test1.shownum();
    
	testclass test3;
	test1.shownum();
	test2.shownum();
	test3.shownum();
    
	return 0;
}

 

 

따라서 위 코드의 결과는 다음과 같다.

 

그런데 static 멤버변수를 정의하는 방법이 조금 독특할 것이다.

아래 코드와 같이 클래스 내부에서 초기화하는 것이 아니라 클래스 외부에서 클래스 이름을 통해 접근하여 정의하고 있다.

int testclass::num = 0;

 

static 멤버 변수는 클래스와 독립적으로 존재하기 때문에 반드시 전역범위에서 초기화를 해주어야 한다.

 

이때 static 변수를 선언하는 것만으로는 메모리가 할당되지 않는다.

초기화를 통해서 정의를 해주면 비로소 메모리가 할당된다.

 

 

 

 

 

 

static 멤버변수의 또 다른 접근방법

 

static 멤버변수는 클래스와 독립적으로 존재하기 때문에 전역변수와 마찬가지로 어디서든 접근이 가능하다.

 

물론 private으로 선언되면 해당 클래스의 객체를 통해서만 접근이 가능하다.

 

반면 public으로 선언된 static 변수에는 클래스 이름을 통해 어디서든 접근이 가능하다.

 

#include <iostream>
using namespace std;

class Simple {
public:
	static int simpleint;
    
	Simple() {
		simpleint++;
	}
};
int Simple::simpleint=0;

int main()
{
	cout << Simple::simpleint << endl;
	return 0;
}

 

그렇다면 public으로 선언된 static 변수는 전역변수와 다른 점이 무엇인가? 라고 생각할 수도 있다.

 

public으로 선언된 static 변수는 class명을 통해 접근하는 것으로 관련된 코드에서만 사용하도록 유도하고 있다.

 

 

 

 

 

 

 

 

static 멤버함수

 

static 멤버함수도 그 특성이 static 멤버변수와 비슷하다.

 

선언된 클래스의 모든 객체가 공유하며

public으로 선언되면 클래스 이름을 통해 접근이 가능하며

클래스와 독립적으로 존재한다.

 

이 중 클래스와 독립적으로 존재한다는 특성으로 인해 아래와 같은 코드는 에러를 일으킨다.

 

class Simple
{
private:
	int num1;
	static int num2;
public:
	Simple(int n)
		: num1(n)
	{ }
	static void Adder(int num)
	{
		num1 += num;
		num2 += num;
	}
};
int Simple::num2 = 0;

 

static 멤버함수인 Adder에서 num2에 접근하는 것은 가능하지만 num1에 접근하는 것은 문제가 된다.

 

Adder는 객체의 멤버로서 존재하는 것이 아니기 때문에 멤버변수에 접근이 불가능한 것이다.

 

따라서 static 멤버함수에서는 static 멤버변수와 static 멤버함수만 호출이 가능하다.

 

 

 

 

 

 

728x90
반응형