정적 멤버

Jaemyeong Lee·2024년 8월 14일
0

FastCampusC++

목록 보기
58/78
#pragma once
class Person
{
private:
    static int num0;
    // private 정적 멤버 변수, 클래스 외부에서 접근 불가하며, 모든 객체가 공유한다.

public:
    static int num1;
    // public 정적 멤버 변수, 클래스 외부에서도 접근 가능하며, 모든 객체가 공유한다.

    static const int num2;
    // const로 선언된 정적 멤버 변수, 상수로 사용되며, 모든 객체가 공유한다.

    Person();
    // 생성자 선언, 객체가 생성될 때 호출된다.

    void print();
    // 일반 멤버 함수 선언, 객체에 속하며 객체를 통해 호출된다.

    static void staticPrint();
    // 정적 멤버 함수 선언, 객체에 속하지 않고 클래스 이름으로 호출된다.
};

void personFunc();
// 독립적인 함수 선언, Person 클래스와는 독립적이지만 해당 클래스의 객체를 다룬다.

위의 클래스 선언을 통해 Person 클래스는 정적 멤버 변수 num0, num1, num2와 정적 멤버 함수 staticPrint를 가지고 있습니다. num0은 private이므로 클래스 외부에서 접근할 수 없으며, num1num2는 public이어서 외부에서도 접근 가능합니다.

#include <iostream>
#include "Person.h"

using namespace std;

// 클래스 멤버 변수 초기화
int Person::num0 = 0;
// 정적 멤버 변수 num0의 초기화, 반드시 클래스 외부에서 초기화해야 한다.

int Person::num1 = 0;
// 정적 멤버 변수 num1의 초기화, 클래스 외부에서 초기화.

const int Person::num2 = 0; 
// 정적 멤버 변수 num2의 초기화, const로 선언되었기 때문에 초기화가 필수적이다.

클래스의 정적 멤버 변수는 클래스 외부에서 초기화해야 합니다. num0, num1, num2 모두 클래스 정의 외부에서 초기화되고 있습니다. num2const로 선언되었으므로, 반드시 초기화가 필요합니다.

Person::Person()
{
    num0++;
    // 생성자가 호출될 때마다 num0이 증가한다. 이는 모든 객체가 공유하는 변수이므로, 객체 수를 추적하는 용도로 사용될 수 있다.
}

void Person::print()
{
    cout << num0 << endl;
    // 현재까지 생성된 Person 객체 수를 출력한다.
}

void Person::staticPrint()
{
    cout << num0 << endl;
    // 정적 멤버 변수 num0의 값을 출력한다.

    //print(); 
    // 비 정적 멤버 함수인 print()는 호출할 수 없다. 정적 멤버 함수는 특정 객체에 속하지 않기 때문에, this 포인터가 없다.
}

void personFunc()
{
    Person p0;
    Person p1;
    // Person 객체 p0, p1 생성, 생성자 호출로 인해 num0이 두 번 증가한다.

    p0.print();
    p1.print();
    // p0, p1의 print() 함수 호출, 동일한 num0 값을 출력한다.

    // public static 멤버 접근
    cout << Person::num1 << endl;
    // 정적 멤버 변수 num1에 클래스 이름으로 접근하여 값을 출력한다.

    Person::staticPrint();
    // 정적 멤버 함수 staticPrint를 클래스 이름을 통해 호출한다.

    p0.staticPrint();
    // 정적 멤버 함수는 객체를 통해서도 호출 가능하다. 하지만 이때도 해당 함수는 객체에 속하지 않고, 클래스에 속한다.
}

위의 코드에서는 Person 클래스의 생성자가 호출될 때마다 num0이 증가합니다. 이 값을 print 함수를 통해 출력하면, 현재까지 생성된 Person 객체의 수를 알 수 있습니다. 또한, 정적 멤버 함수 staticPrint는 클래스에 속하므로, 특정 객체가 아닌 클래스 이름을 통해 호출할 수 있습니다. staticPrint는 정적 멤버 변수에만 접근할 수 있고, 비 정적 멤버 함수는 호출할 수 없습니다.

#include <iostream>
#include "auto_static.h"
#include "Person.h"

using namespace std;

int main()
{
    autoStatic();
    // 다른 기능을 하는 함수 autoStatic 호출 (구체적인 구현은 제공되지 않음).

    personFunc();
    // personFunc() 호출, 내부에서 Person 클래스와 관련된 여러 동작이 수행된다.
}

main 함수에서는 personFunc을 호출하여 Person 클래스와 관련된 기능을 실행합니다. 이때 personFunc 내부에서는 Person 객체를 생성하고, 정적 멤버 함수 및 변수를 사용하는 예시를 보여줍니다.

요약

정적 멤버(static member)의 특징

  • 정적 멤버 변수: 클래스의 모든 인스턴스가 공유하며, 클래스 외부에서 초기화해야 합니다.
  • 정적 멤버 함수: 특정 객체에 속하지 않고, 클래스 이름으로 호출합니다. 정적 멤버 함수에서는 비 정적 멤버를 사용할 수 없습니다.

코드 분석 요약

  • Person 클래스는 정적 멤버 변수를 통해 모든 객체가 공유하는 데이터를 다루며, 정적 멤버 함수는 클래스 자체에서 동작하는 기능을 제공합니다.
  • personFunc 함수는 객체 생성과 정적 멤버 변수, 함수 사용의 예를 보여줍니다.
profile
李家네_공부방

0개의 댓글