class X
{
friend class Y; <-- friend 선언, public으로 지정 안해도 접근 가능하다.
private:
int mPrivateInt;
};
class Y
{
public:
void Foo(X& x);
};
void Y::Foo(X& x)
{
x.mPrivateInt += 10; <-- X 클래스의 private 멤버 변수 접근이 가능하다. Compile OK
}
- OOP에서는 friend는 안티 패턴
- 그러나 frined가 필요한 경우가 있음...
- 캡슐화 되어 외부로 보여주지 않아야 하는데...
- 시나리오
- 어떤 큰 덩어리 클래스가 있음, 너무 커서 나누고 싶음
- 나눴음, 그런데 서로 나눈 모듈끼리 인터페이스를 참조 할 수 있어야 하는데...
- 서로 나눈 모듈끼리만 참조 가능하게끔 하고 그 이외 관련 없는 모듈끼리는 참조 못하게 하고 싶음
- 서로 나눈 모듈끼리 friend 를 지정함
- Java에서는 같은 패키지 안에서는 서로 참조가 가능함
- 패키지 단위로 모듈을 생각함.
- C#에 internal 키워드 있음.
- friend 를 무조건 피하지도 말고 남용 하지도 말자