data_members — 데이터 멤버

data_members — 데이터 멤버

**데이터 멤버(data member)**는 클래스/구조체의 안에 선언된 변수예요. 각 객체(인스턴스)는 자기만의 데이터 멤버 값 복사본을 가져요.

객체가 "가지고 있는 상태"를 저장해요. 접근 지정자(public/private/protected), 정적 멤버, 기본 멤버 초기화자 등과 함께 쓰여요.

출처: cppreference

본문

데이터 멤버는 클래스에 선언된 비함수 멤버(변수)예요. 인스턴스마다 값이 존재해요.

선언

struct Point {
    int x;          // 데이터 멤버
    int y;
};
Point p{1, 2};      // p.x = 1, p.y = 2

접근 지정자

class Widget {
private:
    int secret = 0;        // 외부 접근 불가
protected:
    int guarded;           // 파생에서 접근 가능
public:
    int exposed;           // 누구나 접근
};

static 데이터 멤버

static 데이터 멤버는 인스턴스가 아니라 클래스에 하나만 존재해요. 모든 객체가 공유해요.

struct Widget {
    static int instance_count;   // 선언
};
int Widget::instance_count = 0;  // 정의

C++17부터 inline static으로 클래스 안에서 정의할 수 있어요.

기본 멤버 초기화자 (member initializer)

데이터 멤버에 기본값을 줄 수 있어요.

struct Widget {
    int id = 0;          // 기본값 0
    std::string name = "unnamed";
};

이렇게 하면 생성자가 해당 멤버를 초기화하지 않아도 기본값을 가져요.

멤버 초기화 순서

멤버는 선언된 순서로 초기화돼요. 초기화 목록의 순서가 아니라 선언 순서예요.

struct S {
    int a;
    int b;
    S(int x) : b(x), a(x) {}   // a 가 b 보다 먼저 초기화 (선언 순서)
};

const 멤버와 참조 멤버

const 멤버와 참조 멤버는 반드시 멤버 초기화 목록에서 초기화해야 해요.

struct S {
    const int id;          // 생성자에서 초기화
    int& ref;
    S(int i, int& r) : id(i), ref(r) {}
};

메모리 레이아웃

데이터 멤버는 클래스 안에 선언 순서대로 배치되고, 정렬·패딩이 적용돼요. sizeof로 클래스 크기를 얻을 수 있어요.

노트 (Notes)

  • 데이터 멤버는 멤버 함수(메서드)와 구분돼요 — 데이터 멤버는 상태, 멤버 함수는 행동.
  • = delete된 파생 등을 제외하면, 데이터 멤버 관리(수명)는 클래스의 책임이에요.
  • 캡슐화를 위해 보통 데이터 멤버는 private로 두고 접근자는 public으로 해요.

더 알아보기 (Learn more)

cppreference