항목 23. 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자
캡슐화 를 하면 외부에서 볼 수 없게 된다.
캡슐화 하는 것이 늘어나면 밖에서 볼 수 있는 것들이 줄어든다.
밖에서 볼 수 있는 것이 줄어들면 그것들을 바꿀 때 필요한 유연성이 커진다.
캐시제거, URL제거, 쿠키제거 하는 함수가 존재한다.
위 3개 함수를 한번에 모아둔 함수가 존재할 것이다.
class WebBrowser {
public:
void clearCache ();
void clearHistory ();
void removeCookies ();
void clearEverything (); // 위 3개를 한번에 호출해 주는 함수
}
clearEverything
함수는 멤버 함수 가 아닌 비멤버 함수 로 제공할 수 있다.
void clearBrowser (WebBrowser& wb)
{
wb.clearCache ();
wb.clearHistroy ();
wb.removeCookies ();
}
비멤버 함수 가 캡슐화 정도가 높고 패키징 유연성 또한 높다.
컴파일 의존도도 낮추고 WebBrowser
클래스의 확장성 도 높일 수 있다.
프렌드 함수 는 private
멤버에 대한 접근 권한이 해당 클래스의 멤버 함수가 가진 접근 권한과 같기 때문에, 캡슐화에 대한 영향도 같다.
함수는 어떤 클래스의 비멤버가 되어야 한다라는 주장이 그 함수는 다른 클래스의 멤버가 될 수 없다 라는 의미가 아니다.
clearBrowser
함수를 다른 유틸리티 클래스 같은 데의 정적 멤버 함수로 만들어도 된다는 이야기이다.
WebBrowser
클래스의 멤버(혹은 프렌드)가 아니기만 하면 된다.
private
멤버의 캡슐화에 영향을 주지 않는다는게 중요하다.
C++
는 비멤버 함수 로 두고 같은 네임스페이스 안에 두는것으로 구사할 수 있다.
네임스페이스는 클래스와 달리 여러 개의 소스 파일에 나뉘어 흩어질 수 있기 때문이다.
namespace WebBBrowserStuff {
class WebBrowser { ... };
void clearBrowser (WebBrowser& wb);
...
}