정적 변수와 함수

falseman_go·2022년 5월 7일
0

R&D-Language

목록 보기
10/24

static 키워드와 정적 변수, 함수

C#공부를 했을 때도 간간히 보였던 static 키워드는 정적이라는 의미를 가지고 있다. 보통 객체를 만들어서 멤버 변수나 함수를 만들면 그 둘은 특정 객체에 종속적으로 들어가 있는 것을 알 수 있다. 그런데 여기서 멤버에 static 키워드가 붙으면 모든 객체가 공유하는 멤버로 바뀌게 되는데 이해를 돕기 위해 스타크래프트에 비유하여 코드를 작성해봤다.

class Marine {
public :
	int _hp;
	int _atk;

	Marine() : _hp(100), _atk(5) {}
};

// 메인 함수
int main() {
	Marine m1;
	Marine m2;

	cout << "아카데미 : 공격력 업그레이드!" << endl;
	
	m1._atk += 5;
	m2._atk += 5;
}

마린을 적당히 추상화하고 초기화 리스트를 통해 멤버 변수를 간단히 초기화하였다. 메인 함수에서 마린 객체를 만들고 공격력이 업그레이드되었다는 상황을 가정하여 코드를 작성했는데, 이렇게 하면 큰 문제가 생긴다. 스타크래프트라는 게임의 특성상 공격유닛이 부대단위로 나올 수 있는데 유닛을 업그레이드 하는 과정에서 모든 유닛에 접근하여 저렇게 공격력을 올리는 것은 매우 비효율적인 방식이다. 그렇기 때문에 공격력이나 방어력같은 값은 모든 객체가 공유하는 식으로 만들어 사용하면, 이를 효율적으로 관리할 수있다. 다음은 수정된 코드이다.

// 유닛 클래스 공격력을 가리키는 멤버를 static 키워드로 만든다.
class Marine {
public :
	int _hp;
	static int _atk;

	Marine() : _hp(100) {}
};

// 아카데미의 마린의 공격력을 올려주는 함수를 static 키워드로 정적 함수로 만든다.
class Academy {
public:
	static void UpgradeMarineAttack() {
		cout << "아카데미 : 공격력 업그레이드!" << endl;
		Marine::_atk += 5;
	}
};

// static 키워드로 만들어진 변수는 메인 함수나 클래스 내에서 초기화 할수 없으므로,
// 전역 공간에서 초기화해줘야한다.
int Marine::_atk = 5;

int main() {
	Marine m1;
	Marine m2;
	
    // 아카데미 클래스의 static 함수를 호출하여 마린의 공격력을 올린다.
    // 이때 전역 함수이기 때문에 아카데미 객체를 만들지 않아도 된다.
	Academy::UpgradeMarineAttack();

	cout << m1._atk << endl;
	cout << m2._atk << endl;
}

클래스 내부에 static으로 만든 변수가 private로 보호되고 있다고 해도 전역 공간에서 초기화가 가능하다. 또 정적 함수 내에서 종속적인 멤버 변수의 값을 수정할 수 없고, 이 정적 멤버들은 메인 함수 내에서 만든다고 해도 스택 메모리에 생기지 않는다.

profile
정리하는 블로그

0개의 댓글