C/C++에서의 다양한 변수 선언 방식을 알아보자.
static은 '정적 변수화', 즉 변수의 고정을 의미한다. 따라서 static 변수는 프로그램이 살아있는 동안 정적으로 할당되며, 프로그램과 생사를 같이한다. 때문에 static 변수는 메모리의 Data 영역에 할당된다. C++ 코드를 통해 여러 특징을 살펴보자.
void Count(){
static int cnt = 0;
cnt++;
cout >> cnt >> endl;
}
int main(){
for(int i=0; i<5; i++)
Count();
return 0;
}
''' Result '''
1
2
3
4
5
''''''''''''''
static 변수는 corrutine 작업을 수행할 때 용이하다. 한 번 name이 정의된 static 변수는 재차 생성되지 않는다. 이미 존재한다면 그 변수 값을 사용하기 때문에 위의 코드에서 1이 반복 출력 되는 것이 아니라 cnt의 값이 지속적으로 증가하는 것이다.
void count(){
static int cnt = 0;
cnt++;
cout << cnt << endl;
}
int main(){
for(int i=0; i<5; i++)
count();
cout << cnt << endl;
return 0;
}
''' Result '''
error: 'cnt' was not declared in this scope
''''''''''''''
cnt는 엄연히 count() 함수의 scope 내에서 선언된 변수이다. 저장 위치가 Data영역일 뿐, 외부 scope에서 접근할 수 없다.
class MyClass {
public:
static int a;
int b;
};
class SubClass : public MyClass {
public:
int c;
};
int MyClass::a = 10; // 객체 선언 전 static 변수 초기화 -- (1)
int main() {
cout << MyClass::a << endl; // 10 -- (1)
MyClass test;
test.a=20;
test.b=2;
cout << test.a << endl; // 20
cout << test.b << endl; // 2
SubClass test2;
test2.a = 30;
test2.b = 3;
cout << test2.a << endl; // 30
cout << test2.b << endl; // 3
// What is the result? -- (2)
cout << test.a << endl; -- (2)-1
cout << test.b << endl; -- (2)-2
return 0;
}
위 코드에서 (1)번부터 보자. static 멤버는 main 함수가 호출되기도 전에 메모리 공간에 올라가서 초기화된다. 따라서 public으로 선언된 경우, 객체 생성 이전에도 해당 변수에 접근이 가능하다.
다음으로 (2)번을 살펴보자. static 멤버는 객체의 멤버로 존재하는 것이 아니다. 때문에 static 변수는 같은 클래스 사이에서 전역 변수의 특징을 가진다. 전역 변수는 누구나 접근 가능하다는 위험성을 갖고 있지만, static 변수를 사용하면 캡슐화를 지켜 정보은닉을 해주는 장점을 가진다. 따라서 (2)-1은 '30', (2)-2는 '2'를 출력한다.
✔ 클래스 안에서 변수 초기화는 c++11부터 지원해준다.
다음 포스팅에 계속!
유익한 내용 감사합니다!