본문 바로가기
책 정리/Effective C++ 3rd

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

by ocean20 2020. 1. 9.
class WebBrowser {
public:
  ...
  void clearCache();
  void clearHistory();
  void removeCookies();
  ...
};

class WebBrowser {	//멤버 함수
public :
  ...
  void clearEverything(); // clearCache, History, Cookies를 클리어합니다.
  ...
};

void clearBrowser(WebBroser& wb)  //비멤버 비프렌드 함수
{
  wb.clearCache();
  wb.clearHistory();
  wb.removeCookies();
}

 

1. 비멤버 비프렌드함수가 멤버함수보다 좋은 이유

  (1) 캡슐화 측에서 좋음

  (2) 패키징 유연성

  (3) 컴파일 의존도를 낮춤

  (4) 확장성도 높음

 

2. 캡슐화

  (1) 어떤 데이터에 접근하는 함수가 많으면 데이터의 캡슐화 정도는 낮음

  (2) private 멤버는 멤버 함수 프렌드 함수만 접근 가능

  (3) 비멤버 비프렌드함수를 사용하면 캡슐화 정도가 높음(데이터로 통하는 통로가 증가되지 않으므로)

   *결론 : 객체 지향법칙은 있는 만큼 캡슐화를 하라고 주장하지만, 오히려 멤버함수를 사용하는게 캡슐화가 더형편없다.

 

3. 컴파일 의존도와 패키징 유연성

namespace WebBroserStuff {
  class WebBroser {…};
  void clearBrowser(WebBrowser& sb);
  ...
}

* 풀이

  - clearBrowser 편의상 준비한 함수이며, 멤버도 프렌드도 아니기에, WebBrowser 사용자 수준에서 얻을 없는 것들은 clearBrowser 얻어낼 없다.

  - 웬만한 사용자라면 이러한 편의함수 관심있는 편의함수만 알고 있을테니 다른 편의기능과의 컴파일 의존도를 고민할 이유가 없다.

 

  (1) 의존도를 낮추고 패키지 유연성을 높이는 방법

    1) 함수를 기능별로 하나의 헤더에 몰아 넣는다. (ex. 즐겨찾기 기능)

    2) 다른기능의 함수는 다른헤더에(ex. 쿠키 삭제 기능)

 

  (2) (1) 실례

    1) <C++StandardLibrary> 헤더 같은것에 모든 기능이 섞여 있지 않고, <vector> <algorithm> 같이 수십개의 헤더로 흩어져 선언되어 있다.

    2) <vector>기능만 필요할때, <memory>헤더를 #include 필요가 없다.

 

4. 확장

  (1) 3번내용처럼 편의함수를 여러 헤더로 나누어 놓으면 확장도 쉽다.

  (2) 확장 방법

    1) 다운로드 관련 신규 기능을 만들기 위해, 헤더파일 새로만든다.(동일 네임스페이스안에)

    2) 그안에 관련함수의 선언문만 끼워 넣으면 된다.

 

요약정리

  (1) 멤버함수 보다는 비멤버 비프렌드 함수를 자주 쓰자. 캡슐화, 컴파일 의존도, 패키징 유연성, 확장성들이 개선된다.

댓글