오늘의 주제는 Static 선언에 대해서 알아보도록 하겠습니다. Static 변수는 C언어에서 정적변수로서 변수가 선언된 함수에서 벗어나더라도 Static 변수는 소멸하지 않고 계속 유지 됩니다. Static 변수가 10이라는 값을 가지고 특정 함수 내에서 선언 되었을 때 그 함수의 수행이 끝나더라도 10이란 값을 계속 유지하게 되고 프로그램이 종료때까지 이 변수는 소멸되지 않습니다. 이런 C언어에서의 Static 변수는 C++ 에서도 동일합니다. 중요한 것은 클래스에서 해당 클래스에 대한 여러개의 객체 변수를 선언할 때 여러개의 객체는 독립적으로 멤버변수아 멤버함수가 동작하지만 딱하나 Static 변수로 선언된 것은 공유 상태가 됩니다. 특정 객체의 값을 수정하면 다른 객체에까지 그 수정 된 값이 동일하게 바뀌게 된다는 개념입니다. 이 개념을 잘 잡고 클래스 안의 Static 변수를 선언 해야 합니다.
이 부분은 실습을 해봐야지 정확히 개념을 잡을 수 있으니 한번 알아봅시다.
class AAA {
private:
static int a;
public:
void output(int b){
a=a+b;
cout<<a<<endl;
}
};
위와 같이 AAA라는 클래스가 있을 때 a변수가 Static 변수로 선언하게 하게 되면 해당 a값을 초기화 할 때 다음과 같이 할 수 있습니다.
int AAA::a=0;
이렇게 해서 AAA 클래스 안에 a 변수는 Static 변수로 AAA 클래스에 대한 객체 변수들은 모두 Static형의 a변수를 공유하게 됩니다.
AAA op1;
AAA op2;
AAA op3;
이렇게 세개의 객체 변수가 선언되면 각자 독립적인 처리 동작을 수행합니다. 하지만 3개의 op1, op2, op3의 객체 안에서의 a변수는 공유상태가 됩니다.
위 그림처럼 특정 객체어서 a가 30으로 변경 되면 다른 2개의 객체에서 a 값은 모두 30을 갖게 됩니다. 하나의 값을 수정하면 그 클래스를 사용하는 모든 클래스는 동일한 값을 갖게 됩니다.
그럼 실제로 그렇게 되는지 코딩으로 살펴 봅시다.
[전체소스]
#include
using namespace std;
class AAA {
private:
static int a;
public:
void output(int b){
a=a+b;
cout<<a<<endl;
}
};
int AAA::a=0; //a변수 값 초기화
int main(int argc, char** argv) {
AAA op1;
AAA op2;
AAA op3;
op1.output(10);
op2.output(20);
op3.output(30);
return 0;
}
위 코딩에서 op1, op2, op3등이 각각 객체변수로 개별적인 클래스를 갖게 됩니다. 하지만 Static으로 선언된 a값만 공유하게 됩니다. op1, op2, op3의 멈버 함수 output()은 각각 한번만 호출 되는데 그렇다면 각각 전달 값 10, 20, 30 개별적으로 10, 20, 30으로만 출력 되어야 하겠지만 Static으로 선언하게 되면 op1은 10, 20, 30 순으로 출력 되어야 a변수는 공유 변수임으로 10, 30, 60순으로 출력 됩니다.
[결과]
클래스 안에선 선언된 Static 변수는 다른 객체들에서도 동일한 값을 적용이 됩니다. 실습에서 살펴 본 것 같이 이 개념을 잘 잡아 두시기 바랍니다.