클래스 인스턴스

클래스 저장 위치와 수명 주기

class에 멤버를 넣고 객체를 만든다는 설명만으로는 C++ 객체 모델이 보이지 않는다. 자동 저장 기간, 동적 할당, 멤버 초기화, 복사와 이동, 소멸자 호출 시점을 함께 봐야 객체 생성 코드의 비용과 책임을 판단할 수 있다.

01

클래스 계약 정의

멤버 데이터가 어떤 불변식을 가져야 하고 어떤 함수가 그 상태를 바꿀지 정한다.

public 데이터 노출은 불변식을 약하게 만든다
02

생성 위치 선택

지역 객체, 멤버 객체, 동적 할당, static 객체 중 수명 요구에 맞는 위치를 고른다.

new가 필요 없는 경우가 많다
03

초기화 방식 확인

생성자 본문 대입이 아니라 initializer list로 멤버를 바로 초기화한다.

const와 reference 멤버는 초기화 목록이 필요하다
04

복사와 이동 고려

객체를 값으로 넘기거나 컨테이너에 넣을 때 복사/이동 비용과 의미를 확인한다.

소유 자원이 있으면 Rule of Zero/Five를 본다
05

소멸 시점 확인

스코프 종료, delete, 컨테이너 제거 때 소멸자가 자원을 정리하는지 본다.

RAII가 예외 경로를 안전하게 만든다
Local object
스코프 기반 수명 함수 블록 안에서 자동으로 생성되고 스코프를 벗어나면 소멸된다.
가장 단순하고 안전한 기본값이다
new/delete
수동 수명 관리 동적 수명이 꼭 필요할 때만 쓰고 보통 smart pointer로 감싼다.
delete 누락과 예외 경로를 조심한다
Member object
소유 객체의 일부 포함 관계를 나타내며 바깥 객체 생성과 소멸에 맞춰 움직인다.
초기화 순서는 선언 순서다
Static object
프로그램 수명 프로그램 시작과 종료에 묶이며 초기화 순서 문제가 생길 수 있다.
전역 상태 남용을 피한다

객체 확인

수명 표시 객체가 언제 생성되고 언제 소멸되는지 코드 옆에 표시한다.
초기화 목록 멤버가 생성자 본문에서 재대입되지 않고 올바르게 초기화되는지 본다.
소유권 동적 할당이 있다면 누가 delete하거나 smart pointer로 소유하는지 확인한다.