Skip to content

Latest commit

 

History

History
51 lines (47 loc) · 2.29 KB

Item23.md

File metadata and controls

51 lines (47 loc) · 2.29 KB

항목 23. 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자

캡슐화

  1. 캡슐화를 하면 외부에서 볼 수 없게 된다.
  2. 캡슐화 하는 것이 늘어나면 밖에서 볼 수 있는 것들이 줄어든다.
  3. 밖에서 볼 수 있는 것이 줄어들면 그것들을 바꿀 때 필요한 유연성이 커진다.

웹브라우저를 나타내는 클래스

  • 캐시제거, 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);
    ...
}