인프런 커뮤니티 질문&답변

정승우님의 프로필 이미지
정승우

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문

객체지향 마무리 질문있습니다.

작성

·

178

0

class Marine
{
public:
	// 특정 마린 객체에 종속적
	int _hp;

	void TakeDamage(int damage)
	{
		_hp -= damage;
	}

	static void SetAttack()
	{
		s_attack = 100;
	}

	// 특정 마린 객체와 무관
	// 마린이라는 '클래스' 자체와 연관
	static int s_attack; // 설게도 상으로만 존재
};
int GenerateId()
{
	// 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음)
	// 가시범위 :

	// 정적 지역 객체
	static int s_id = 1;

	return s_id++;
}

강의에서 나오는 Marine클래스와 GenerateId()함수입니다.

강의 중 GenerateId()함수를 여러번 부를 경우 정적 지역 객체인 s_id가 계속해서 1로 초기화 되는 것이 아닌,

처음 함수를 부를 때만 1으로 초기화 되고 그 다음부터는 ++만 연산해서 1, 2, 3, ... 과같이 s_id가 계속해서 증가하는 모습을 보였습니다.

그래서 저는 Marine클래스의 SetAttack()도 처음에만 100으로 세팅해주는것인가? 라는 생각이 들어

	Marine::SetAttack();
	cout << m1.s_attack << endl;

	Marine::s_attack = 7;
	cout << m1.s_attack << endl;

	Marine::SetAttack();
	cout << m1.s_attack << endl;

이렇게 실행해 보았으나, 출력이 100 7 100으로 다시 초기화가 된 것을 확인하였습니다.

왜 SetAttack()은 부를때마다 초기화가 진행되고 GenerateId()는 그렇지 않은 것인가요?

 

 

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

문법의 차이가 있습니다.

int GenerateId()
{
	// 생명주기 : 프로그램 시작/종료 (메모리에 항상 올라가 있음)
	// 가시범위 :

	// 정적 지역 객체
	static int s_id = 1;

	return s_id++;
}

위 코드에서 static int s_id = 1처럼
어떤 변수를 static으로 하고 초기화하는 코드를 만들면
static 문법 때문에 딱! 1번만 실행(초기화)됩니다.
그리고 그 시점은 GenerateId()가 처음 호출될 때입니다.

static void SetAttack()
	{
		s_attack = 100;
	}

반면 위 코드는 이미 만들어진 s_attack에다가 100을 대입하라는 문법이기 때문에
SetAttack()을 호출할 때마다 매 번 s_attack = 100 코드가 실행됩니다.
사실 뭔가를 이해하는 부분이라기보단 문법이 그런거라 받아들이셔야(?) 합니다.

요약 : 지역 static 변수 초기화는 한번!

 

 

 

정승우님의 프로필 이미지
정승우
질문자

아.. 그렇다면 두번째코드에서

static int s_attack = 100;

이렇게 코드가 들어가면 한번만 초기화가되는건가요?

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 그렇습니다.

정승우님의 프로필 이미지
정승우

작성한 질문수

질문하기