[C++] 정적 멤버 (static)

Minjeong Park·2021년 7월 20일
0

CPP

목록 보기
2/5
post-thumbnail
post-custom-banner

정적 멤버 (Static member)

정적 멤버란 클래스에는 속하지만 객체 별로 할당되지 않고 클래스의 모든 객체가 공유하는 멤버를 의미한다. 무슨 소리인지 알듯 말듯 하다. 아래 예제를 보자.

class A
{
public:
	A() = default;
	virtual ~A() = default;

	bool func1();	// 멤버 함수 선언
	static bool func2(); // 정적 멤버 함수 선언
};

int main()
{
	A a;	// 객체를 만듦
	a.func1();	// 멤버함수 호출. `객체이름.멤버함수` 형식

	A::func2();	// 정적멤버함수 호출. `클래스이름::멤버함수이름`gudtlr

	return 0;
}

그냥 멤버함수는 객체를 만들고, 그 멤버함수로 호출해야 하지만, 정적 멤버함수는 객체를 생성하지 않고도 클래스 이름만으로 호출이 가능하다. 더 자세히 알아보자.

정적 멤버 변수 (Static member variable)

멤버 변수가 정적(static)으로 선언되면, 해당 클래스의 모든 객체에 대해 하나의 데이터만이 유지 관리된다. 선언은 클래스 영역에서하고, 정의는 파일 영역에서 수행한다. 외부연결(external linkage)을 가지므로, 여러 파일에서 접근할 수 있다. 예제는 다음과 같다.

class Person

{

private:

    string name_;

    int age_;

public:

    static int person_count_;            // 정적 멤버 변수의 선언

    Person(const string& name, int age); // 생성자

    ~Person() { person_count_--; }       // 소멸자

    void ShowPersonInfo();

};  

...

int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화

정적 멤버 함수 (Static member function)

정적 멤버 함수는 해당 클래스의 객체를 생성하지 않고도, 클래스 이름만으로 호출할 수 있다.
정적 멤버 함수는 다음과 같은 특징을 갖는다.
1. 객체를 생성하지 않고 클래스 이름만으로 호출할 수 있다.
2. 객체를 생성하지 않으므로, this 포인터를 가지지 않는다.
3. 특정 객체와 결합하지 않으므로, 정적 멤버 변수만 사용할 수 있다.
예제는 다음과 같다.

class Person

{

private:

    string name_;

    int age_;

public:

    static int person_count_;            // 정적 멤버 변수의 선언

    static int person_count();           // 정적 멤버 함수의 선언

    Person(const string& name, int age); // 생성자

    ~Person() { person_count_--; }       // 소멸자

    void ShowPersonInfo();

};

...

int Person::person_count_ = 0; // 정적 멤버 변수의 정의 및 초기화

...

int Person::person_count()     // 정적 멤버 함수의 정의

{

    return person_count_;

}

출처

profile
아자아잣
post-custom-banner

0개의 댓글