[CPP] 정적 멤버

클래스의 각 객체는 본인들의 멤버 변수를 따로 가지고 있다. 하지만 멤버 변수의 성격상 이 클래스의 모든 객체들이 공유하면 좋을 멤버 변수가 있는데, 이러한 멤버 변수를 정적 멤버 변수라고 부른다. 멤버 변수 앞에 static 키워드를 붙인다. 정적 멤버 변수와 대조해서 일반 멤버 변수를 동적 멤버 변수라고 부르기도 한다.

class MyClass {
   int x;  // 동적 멤버 변수
   YourClass c; // 동적 멤버 변수

   static int z; // 정적 멤버 변수
   static OurClass w;  // 정적 멤버 변수
   ...
};

동적 멤버 변수는 객체가 모두 따로 가지고 있다. 따라서 객체가 생성될 때 동적 멤버 변수를 저장할 공간도 마련되고, 객체를 새로 만들 때 자동으로 호출되는 생성자에서 동적 멤버 변수를 초기화 한다.

정적 멤버 변수는 static 키워드를 붙여 선언한 멤버 변수이고, 클래스가 있다면 (객체가 생성되기 전에도) 이 정적 멤버 변수는 있어야 한다. 따라서 프로그램이 시작되어 main 함수가 호출되기 전에 각 클래스의 정적 멤버 변수를 저장할 공간을 마련한다. 보통 전역 변수를 선언하는 위치에서 정적 멤버 변수를 초기화한다.

// MyClass.h
class MyClass {
};

// MyClass.cpp
int MyClass::z = 0;
OurClass MyClass::w;

정적 멤버 함수는 정적 멤버 변수만을 사용하는 멤버 함수이다. 멤버 함수 선언 앞에 static 키워드를 붙인다. 정적 멤버 함수도 특정 객체를 통해 사용할 수 있는 함수라기 보다 클래스를 통해 사용할 수 있는 함수이다. 동적 멤버 함수의 경우 obj.m1()과 같이 호출 객체 obj를 지정하지만, 정적 멤버 함수의 경우 C::m2() 형식으로 m2를 호출한다.

class C {
public:
   void m1();
   static void m2();
};


C obj;
obj.m1();   // 동적 멤버 함수 호출

C::m2();    // 정적 멤버 함수 호출

 

Q. 다음 테이블의 (1)~(4)를 CanRead/CanWrite로 채워 완성하시오.

              || 정적 멤버함수 || 동적 멤버함수
 ============================================
 정적 멤버변수 || (1)          || (3)
 ============================================
 동적 멤버변수 || (2)          || (4)

 

Leave a Reply

Your email address will not be published. Required fields are marked *