C++ 객체 모델

클래스와 객체를 타입, 상태, 수명으로 구분하기

클래스는 멤버 배치를 정의하고 객체는 실제 저장 공간과 수명을 가진다. 선언, 생성, 접근, 파괴 시점을 나눠 보면 구조체와 클래스, 값 객체와 참조 객체의 차이가 또렷해진다.

01

타입 선언

멤버 변수와 멤버 함수를 묶고 기본 접근 제어가 private임을 확인한다.

struct는 기본 public
02

객체 생성

스택, 힙, 정적 저장 기간 중 어디에 놓이는지에 따라 수명 관리 방식이 달라진다.

저장 기간 분리
03

멤버 접근

public 인터페이스를 통해 상태를 바꾸고 private 멤버는 불변식을 보호한다.

직접 수정 차단
04

파괴 시점

스코프 종료, delete, 프로그램 종료에서 소멸자가 호출되는 순서를 따진다.

RAII 출발점
캡슐화
상태 변경 경로 제한 필드 공개보다 유효한 전이만 허용하는 메서드가 안전하다.
setter 남발 경계
값 객체
복사와 이동 비용이 중요 객체를 값으로 넘기면 생성자, 복사/이동 생성자, 소멸자 호출이 따라온다.
trace로 확인
참조 객체
소유권이 외부에 있음 포인터와 참조 멤버는 대상 수명이 객체보다 길어야 한다.
dangling 위험
불변식
생성 후 항상 참이어야 하는 조건 생성자에서 완성하고 모든 public 함수가 조건을 깨지 않게 한다.
예외 안전성 포함

초기화 · 접근 제어 · 수명 점검

초기화 모든 멤버가 정의된 값으로 시작하는지 member initializer list를 확인한다.
접근 제어 외부 코드가 불변식을 우회해 private 상태를 바꿀 수 없는지 본다.
수명 객체가 참조하는 자원의 수명이 객체보다 먼저 끝나지 않는지 검토한다.