작성
·
181
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
문법의 차이가 있습니다.
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;
이렇게 코드가 들어가면 한번만 초기화가되는건가요?