KoreanFoodie's Study

Effective C++ | 항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자 본문

Tutorials/C++ : Advanced

Effective C++ | 항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자

GoldGiver 2022. 10. 25. 16:14

C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!

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

핵심 :

멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰자. 캡슐화 정도가 높아지고, 패키징 유연성도 커지며, 기능적인 확장성도 늘어난다.

 

웹 브라우저에서 캐시를 비우는 함수, URL 기록을 없애는 함수, 쿠키를 제거하는 함수가 있다고 하자. 세 동작을 동시에 하도록 만드는 함수를 정의할 때, 멤버 함수로 만드는 것이 좋을까, 비멤버 함수로 제공하는 것이 더 좋을까?

class WebBrowser
{
  public:
    void clearCache();
    void clearHistory();
    void removeCookies();
    
    // 1. 멤버함수 - 위 함수 3개 호출
    void clearEverything();
};

// 2. 비멤버함수 - 함수 3개 호출
void clearBrowser(WebBrowser& wb)
{
  wb.clearCache();
  wb.clearHistory();
  wb.removeCookies();
}

일반적으로 2번, 비멤버함수를 사용하는 것이 더 낫다!

 

일단, 캡슐화의 관점에서 보면 clearBrowser 를 비멤버함수로 두는 것이 더 낫다. 왜냐면 멤버함수가 아니기 때문에 수정 및 삭제 문제로부터 자유롭기 때문이다.주의해야 할 부분은, 위 내용은 '비프렌드' 함수에만 적용된다는 것이다. 프렌드 함수일 경우, 캡슐화에 영향을 끼칠 것이기 때문이다. 또한 해당 함수가 다른 클래스의 멤버가 될 수도 있고, 아닐 수도 있다는 것이다. 다음처럼 구현하면 매우 자연스러울 수 있다.

namespace WebBrowserStuff
{
  class WebBrowser { ... };
  void clearBrowser(WebBrowser& wb);
  ...
}

namespace 를 활용해서, 여러 파일에서 필요한 부분들로 함수를 쪼개 쓰면 된다! 예를 들어, 웹 브라우저 관련 기능을 추가 하고 싶으면 헤더 파일을 하나 만들고, WebBrowswerStuff 네임스페이스 를 만들어서 관련 함수를 작성하기만 하면 된다(확장성)!

Comments