외부 코드는 직접 읽을 수 없고, 공개 API 또는 friend 선언이 필요하다.
경계 규칙
friend 대상 지정
`friend`가 있으면 내부 멤버 접근은 가능하지만, 멤버 함수가 되거나 관계가 자동으로 퍼지지는 않는다. `operator<<` 패턴도 이 경계를 지켜야 다형성과 캡슐화가 유지된다.
접근 통로
`friend std::ostream& operator<<(std::ostream&, const Point&)`로 허용한다.
다형성 계층에서 값으로 받으면 객체 슬라이싱이 생길 수 있다.
class Point {
private:
int x, y;
public:
friend std::ostream& operator<<(std::ostream& os, const Point& p);
};
권한이 퍼지지 않는 세 가지 방향
A가 B의 friend여도, B의 friend인 C가 자동으로 A의 friend가 되지 않는다.
기반 클래스의 friend 권한이 파생 클래스 내부까지 자동 확장되지 않는다.
A가 B를 friend로 선언해도 B가 A의 private 멤버를 열어준 것은 아니다.
단순 조회는 `const` 게터, 의미 있는 조작은 공개 멤버 함수로 표현한다.