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으로 해요.