inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

220

정승우

작성한 질문수 13

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()는 그렇지 않은 것인가요?

 

 

c++ oop C++

답변 1

1

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 변수 초기화는 한번!

 

 

 

0

정승우

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

static int s_attack = 100;

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

0

Rookiss

네 그렇습니다.

visualstudio에서 파일분할관리실습시 설정 문의를 드립니다.

0

559

1

정렬함수 좀 더 확실하게 이해 할 방법이 있을까요?

0

453

1

strcpy() 구현 관련 질문

0

533

1

빌드(망치)를 누르니 이런 오류가 떴습니다. 어떻게 해야 하나요?

0

475

1

클래스 타입의 포인터 질문합니다

0

559

1

입력값을 enum 값에 넣어주는거 이제 막혔나요?

0

503

1

템플릿 특수화 관련 질문

0

389

1

포인터 관련 질문합니다!

0

270

1

Unable to start assembler. Check your settings.

0

848

2

cpu선택

0

548

1

포인터 질문이 있습니다

0

331

1

20:35 에서 구조체 크기에 대한 질문입니다!

0

589

1

iterator 삭제관련

0

415

1

함수 호출을 디스어셈블러로 분석하다가 궁금점이 생겼습니다!

0

316

1

15 분 45초 대 질문

0

317

0

스택 프레임 질문합니다!

2

312

1

오른값 참조 in 게임

0

391

0

동적할당 질문이 있습니다

0

457

1

안녕하세요 메모리에 대해 질문드립니다.

0

312

1

함수객체 의 매개변수

0

365

1

복사생성자

0

439

1

main이나 endl 부분이 주황색으로 표시된건 어떻게 하나요

0

430

1

포인터 실습 강의를 보고 궁금한게 있습니다.

0

359

1

스택 오버플로우

2

801

1