경계 규칙

friend 대상 지정

`friend`가 있으면 내부 멤버 접근은 가능하지만, 멤버 함수가 되거나 관계가 자동으로 퍼지지는 않는다. `operator<<` 패턴도 이 경계를 지켜야 다형성과 캡슐화가 유지된다.

접근 통로

class Point `x`, `y`는 private 상태

외부 코드는 직접 읽을 수 없고, 공개 API 또는 friend 선언이 필요하다.

operator<< `std::ostream`을 좌측 피연산자로 받는 외부 함수

`friend std::ostream& operator<<(std::ostream&, const Point&)`로 허용한다.

const Base& 출력 연산자는 값보다 참조가 안전하다

다형성 계층에서 값으로 받으면 객체 슬라이싱이 생길 수 있다.

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` 게터, 의미 있는 조작은 공개 멤버 함수로 표현한다.