캡슐화는 데이터를 숨기는 일이 아니라, 객체가 깨진 상태로 보이지 않게 하는 일이다. 불변식은 생성 이후 공개 연산이 끝날 때마다 참이어야 하는 조건이다.

C++ 12. 캡슐화와 불변식의 핵심 흐름도
그림. 캡슐화의 목적은 객체가 깨진 상태로 보이지 않게 하는 것이다.

범위를 타입 안에 두기

class Depth {
public:
    explicit Depth(int n) : n_{n < 1 ? 1 : n} {}
    int get() const { return n_; }
private:
    int n_;
};

깊이 0을 허용하지 않는다면, 그 거절은 사용하는 쪽마다 흩어두지 않고 생성자에 둔다. 이후의 멤버 함수는 `n_ >= 1`이라고 가정할 수 있다.

공개 면적을 줄이기

공개 함수는 호출자가 필요로 하는 동작만 연다. 내부 버퍼의 주소를 반환해 호출자가 수명을 무시하고 쓰게 하면 캡슐화는 깨진다. 읽기가 필요하면 값이나 `const` 참조, 또는 나중에 볼 뷰 타입으로 빌려 준다.

`friend`는 특정 함수에만 비공개 접근을 허용한다. 연산자 구현처럼 멤버로 두면 어색한 경우에 한정한다. 클래스 전체를 친구로 여는 일은 드물어야 한다.