[C++] 정적(static) 멤버 변수, 함수

SuLee·2021년 9월 10일
0

C++

목록 보기
6/8

📌 1. 정적(static) 멤버 변수

만약 인스턴스의 총 개수를 알기 위해서는 어떤 방법을 사용해야 될까? 전역 변수를 사용하는 방법이 있겠지만 가독성과 안전성이 떨어진다. 이럴 때 전역 변수 대신 사용할 수 있는 것이 정적 멤버 변수다.

정적 멤버 변수는 각각의 인스턴스가 가지는 고유의 멤버 변수와 달리 클래스 안에 단 하나만 존재하고 모든 인스턴스가 공유한다.

정적 멤버 변수는 클래스 내부에서 선언할 때 초기화할 수 있는 멤버 변수와 달리 반드시 클래스 외부에서 초기화해야 한다. 단, const static 변수는 예외적으로 클래스 내부에서 초기화가 가능하다.

class Test {
private:
    // static int a = 0; 불가능
    static int a;
    const static int b = 0; // 가능
public:
    Test() { a++; } // 생성 시 1 증가
    ~Test() { a--; } // 소멸 시 1 감소
};

int Test::a = 0; // 클래스 외부에서 초기화

📌 2. 정적(static) 멤버 함수

일반 멤버 함수 앞에 static을 붙이면 정적 멤버 함수가 된다.

정적 멤버 함수정적 멤버 변수와 마찬가지로 각각의 객체가 아닌 클래스에 종속되는 것이므로 일반 멤버 함수와 다르게 아래의 방식으로 호출해야 된다.

(객체).(멤버 함수) // 일반 멤버 함수
(클래스)::(정적 멤버 함수) // 정적 멤버 함수

정적 멤버 함수 내에서 일반 멤버 변수를 다루게 되면 어느 객체의 변수인지 알 수 없으므로 정적 멤버 함수 내에서는 정적 멤버 변수만 다룰 수 있다.

#include <iostream>
using namespace std;

class Test {
private:
    static int num; // 정적 멤버 변수
public:
    Test() { num++; } // 생성 시 1 증가
    ~Test() { num--; } // 소멸 시 1 감소
    
    static void ShowNum(); // 정적 멤버 함수
};

int Test::num = 0; // 클래스 외부에서 초기화
void Test::ShowNum() { cout << num << endl; }


int main() {
    Test t;
    Test::ShowNum();
}

0개의 댓글