출저 : 프로그래밍 입문 사이트 ~bituse~ | http://bituse.info/cp/17


이번엔 클래스 안에서 static 지정자를 사용했을 때의 경우에 대해서 설명합니다. 클래스 내부에서 static을 사용하면, 변수는 정적 멤버 변수가 되고, 그 클래스의 인스턴스를 몇 개를 만들어도, 그 변수는 전부 공유되어 하나가 됩니다.

일반적으로 클래스 내부의 변수는, 인스턴스 마다 변수를 가지고 있지만, static 지정자를 단 변수에 대해서는, 하나 뿐이 되어 공유되게 됩니다. 일반적인 인스턴스를 만들면, 그 클래스의 변수를 포함하는 영역이 확보되지만[각주:1], 이 정적 멤버 변수른 인스턴스를 만들지 않아도 처음부터 공간이 확보되어 있습니다.

즉, 클래스의 구성원이 있더라도, 영역만은 다른 곳에서 확보되어있다는 것입니다. 그러므로, 클래스 외부의 글로벌 영역에서 변수를 선언하고 실체를 작성해야 합니다.


또한 함수에 static 지정자를 쓰면 정적 멤버 함수가 되며, 인스턴스를 만들지 않아도 그 기능을 수행할 수 있습니다. 하지만, 그 함수에서 접근하는 변수는 정적 멤버 변수 뿐입니다. 또한 클래스의 일반 함수는 정적 멤버 변수, 멤버 함수에 액세스할 수 있습니다.

아래코드를 보세요:

class TEST { public:     int temp;     static int figure;

static void func(int a) {         figure = a;         //temp 변수는 정적 멤버가 아니기 때문에 액세스 불가능         //temp = a;     } }; int TEST::figure = 10; int main(void) {     //인스턴스가 생성되어도 액세스 가능     printf("%d\n",TEST::figure);     //정적 함수 인스턴스 생성 없이 액세스 가능     TEST::func(100);     printf("%d\n",TEST::figure);     //TEST 클래스를 세 번 선언     TEST aaa[3];     aaa[0].temp = 1;     aaa[1].temp = 2;     aaa[2].temp = 3;     aaa[0].figure = 10;     aaa[1].figure = 11;     aaa[2].figure = 12;     //각각 표시     for (int i=0; i<3; ++i) {         printf("%d,",aaa[i].temp);     }     //개행     puts("");     for (int i=0; i<3; ++i) {         printf("%d,",aaa[i].figure);     }     //개행     puts("");     return 0; }

위 코드를 실행하면 이렇게 나옵니다.


xcoderun


변수 figure와 func 함수에 static 지정자를 달고 있습니다 그리고 글로벌 영역에서 figure를 선언하고 실체를 만들고 있습니다. main 함수 내부를 보십쇼. 처음에 printf를 실행하고 있습니다만, 아직 인스턴스는 만들지 않았음에도 불구하고 정적 멤버 변수 figure의 값을 표시할 수 있습니다. 또한 정적 멤버 함수 func에도 액세스 할 수 있습니다.

정적 멤버에는 이렇게


클래스_이름::정적_멤버_변수(함수)


로 액세스 가능합니다.


다음은 TEST 클래스의 인스턴스를 세 개 생성합니다. 일반 변수 temp에는 각각의 인스턴스에서 다른 값을 넣어줍니다. 마찬가지로 변수 figure에도 각각의 인스턴스에서 다른 값을 넣어줍니다. 하지만 각각의 값을 표시하여 보면, 일반 temp 변수는 서로 다른 값이 들어있는 반면, 정적 멤버 변수 figure는 모두 12로 되어있습니다.

aaa[0].figure = 10;

aaa[1].figure = 11;

aaa[2].figure = 12;

이 코드에서, 각각의 인스턴스에 다른 숫자를 넣었습니다만, 정적 멤버 변수이므로, 변수가 공유되고, 어떤 인스턴스에 대해서도 마지막으로 할당한 12의 값이 표시되었다는 겁니다.


이것이 정적 멤버 변수와 정적 멤버 함수의 구조입니다. 이해하실 수 있으셨습니까?


  1. 인스턴스를 선언하면 프로세스가 끝날 때까지 메모리를 상주하는 것 [본문으로]

'공부 > C/C++' 카테고리의 다른 글

c++ 블럭 주석을 OnOff 하기 편하게 사용하기  (0) 2015.02.17
포인터와 동적배열  (0) 2014.08.21
(C++) 컨테이너【set】  (0) 2014.04.04
(C++) 컨테이너【map】  (0) 2014.04.04
(C++) 컨테이너【queue】  (0) 2014.04.04