9. 변수 삼형제
전역 변수, 지역 변수, 정적 변수
▼ 전지적 3 변수, 변수 삼 형제
전지적 3 변수는 전역 변수, 지역 변수, 정적 변수를 내 맘대로 붙여 쓰는 말이다.
변수는 '변하는 수'를 줄임말로 CPP에서 값을 바꿀 일이 있는 수들을 뜻한다.
전역 변수(Global)
▼ 전역 변수 예제
#include <cstdio>
int gGlobalInt = 4;
int main()
{
printf("This is the global int %d\n", gGlobalInt);
return (0);
}
전역 변수는 간단히 말하면 모든 코드 블록 밖에서 선언할 수 있는 변수다.
코드 블록밖에 있기 때문에 일단 선언되면 프로그램이 끝날 때까지 사라지지 않는 특징이 있다.
CPP에서는 {코드 블록}을 벗어나면 메모리에서 삭제한다는 것을 잊지 말자.
전역 변수에는 extern과 static 두 키워드를 사용할 수 있다.
extern과 static의 차이는 확장해서 사용할 수 있느냐 없느냐의 차이가 있다.
▼ extern과 static의 차이
이러한 특징으로 특히 extern은 게임에서 주로 절대 변하지 않는 값들을 지정할 때 많이 사용한다.
지역 변수(Member)
▼ 지역변수 예제
#include <cstdio>
int main()
{
int mMemberInt = 4;
printf("This is the global int %d\n", mMemberInt);
return (0);
}
지역변수는 코드 블록 안에서 선언하는 변수다.
CPP 기초 책에서 가장 많이 사용하는 변수인 만큼 낯설지 않다.
지역변수는 메모리에서 스택(Stack)에 저장된다.
간단히 말하면 컴파일할 때 메모리에 하나씩 차곡차곡 쌓아 두는 것이다.
정적 변수(Static)
위의 전역 변수에서 나왔던 static과는 다른 static이라 생각해도 좋다.
애초에 CPP 컴파일러도 다르게 생각하고 작동한다.
▼ 정적 변수 예제
#include <cstdio>
void StaticAddOne()
{
static int sStaticInt = 0;
sStaticInt++;
printf("This is the static int %d\n", sStaticInt);
}
int main()
{
StaticAddOne();
StaticAddOne();
StaticAddOne();
StaticAddOne();
return (0);
}
이 코드에서도 알 수 있듯이 sStaticInt는 코드 단락이 끝났음에도 메모리에서 삭제되지 않고 남아있다.
원래의 멤버 변수였다면 계속해서 1만 출력되었어야 정상이다.
코드 블록이 끝나면 사라지는 기본 멤버 변수와 다르기 때문에 무분별하게 정적 변수를 사용하는 것은 좋지 않다.
이렇게만 보면 멤버 변수로서는 사용하면 안 될 것 같은 기능이지만 반대로 저걸 역이용하여 보안을 위해 사용하는 사례도 있다고 한다.