가티있는블로그

[C++] static member 정적 멤버 데이터, 함수

2021. 8. 19. 17:32 | 프로그래밍/C++

모든 객체는 생성될때 생성자를 호출, 파괴될때 소멸자를 호출하게된다.

따라서 객체의 개수를 관리할 변수가 필요할 때가 있고 객체가 몇개 생성되었는지 개수를 알고싶다면

생성자에서 변수값을 +1, 소멸자에서 변수값을 -1 하면된다.

 

전역변수를 사용해서 객체의 개수를 관리하면, 전역변수는 메모리에 하나만 있고 모든 객체가 공유하게 되어 객체의 개수를 구할 수 있다.

하지만 이 경우 외부에서 수정이 가능하기 떄문에, member data로 사용하는데 대신에 static으로 선언하게된다.

 

 

정적 멤버 데이터(static member data)

static이 붙은 멤버 데이터. 멤버이므로 접근 지정자를 사용할 수 있다.

모든 객체가 공유한다.

클래스 내부에 선언을 만들고 클래스 외부에 정의를 만들어야 한다.

정적 멤버 데이타는 객체가 없어도 메모리에 놓인다. 

 

class Car
{
    int speed;
    int color;
    static int cnt; //선언
    
public: 
    Car()  {++cnt;}
    ~Car() {--cnt;}
    
    int getCount() { return cnt;}
};

int Car::cnt = 0; //정의

 

객체 이름을 사용하거나 클래스 이름을 사용해서 접근할 수 있지만, static일 경우는 클래스 이름을 사용해서 접근 하는 것이 가독성이 더 좋다.

 

  외부 정의 멤버 필드 초기화
non static member data O
static member data O X
static const 정수계열 X O
static const 비정수계열 O X
static constexpr X O
inline static X O

+) 멤버필드 초기화란, 클래스내에서 선언 즉시 같이 초기화 하는것. Ex) static const int sdata2 = 0;

 

inline은 C++17이상부터 사용가능. 

 

 

정적 멤버 함수 (static member function)

객체가 없더라도 함수를 불러야하는 경우가 생길 경우

클래스이름::함수이름() 으로 호출한다.

객체 없이 호출 가능한 멤버 함수.

일반 멤버에 접근할 수 없고 정적멤버에만 접근할 수 있다.

 

class Car
{
    int speed;
    static int cnt; 
public:    
    Car()  {++cnt;}
    ~Car() {--cnt;}
    
    static int getCount() { return cnt;}
};
int Car::cnt = 0;   // 

int main()
{
    // 자동차 갯수를 알고 싶다.
    // getCount() 호출
    Car::getCount();
    
    Car c1, c2, c3;
    
    c1.getCount();
}

 

일반멤버함수 vs 정적멤버함수

일반 멤버함수는 각각의 객체에 대한 개별연산

정적 멤버함수는 모든 객체의 공통에 대한 연산

'프로그래밍 > C++' 카테고리의 다른 글

[C++] this 포인터 개념  (0) 2021.08.20
[C++] 상수 멤버 함수 const member function  (0) 2021.08.20
[C++] 복사생성자  (0) 2021.08.19
[C++] 포인터와 레퍼런스  (0) 2021.08.18
[C++] range for, if init, switch init  (0) 2021.07.25