스콧 마이어스의 Effective C++을 읽고 개인 공부 목적으로 요약 작성한 글입니다!
💡 멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰도록 하자!
- 캡슐화 정도 향상
- 패키징 유연성 향상
- 기능적인 확장성 향상
class WebBrowser {
public:
...
void clearCache();
void clearHistory();
void removeCookies();
void clearEverything();
};
웹브라우저에서 사용할 수 있는 함수들
(clearCache(), clearHistory(), removeCookies())을 모아놓은 클래스가 있다고 치자.
그리고
이 함수들을 한 번에 모아서 삭제해주는 clearEverything()
이걸 비멤버 함수로 제공해도 된다
void clearBrowser(WebBrowser& wb) {
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
이렇게..
이 때, 장점은?
멤버 함수인 clearEverything()
을 보면, 비멤버 함수인 clearBrowser()
에 비해 캡슐화 정도가 떨어진다.
당연함
캡슐화하면, 외부에서 볼 수 없게 (접근할 수 없게) 된다.
그니까
캡슐화 ↑
밖에서 접근 ↓
자유도 ↑
캡슐화를 많이 한다 == 밖에서 볼 수 있는 것들이 적어진다 == 변경할 수 있는 자유도가 높아진다
어떤 데이터를 접근하는 함수가 많으면, 그 데이터의 캡슐화 정도가 낮다는 의미이다.
캡슐화,,
당연히
데이터 멤버는 private로 해야겠지?? 참고
private 멤버는 멤버함수와 프렌드 함수만이 접근할 수 있다
프렌드(friend) 함수
private 멤버에 대해 멤버 함수와 같은 접근 권한을 가진다.
이 말은,,
비멤버 비프렌드 함수를 쓰면
캡슐화 정도가 짱 높다는 의미겠지
비멤버 비프렌드 함수는 어떤 클래스의 private 멤버에 접근할 수 없으니까!
긍까
clearBrowser()
함수가 다른 클래스의 정적 멤버 함수가 될 수도 있다.
(WebBrowser가 가진 private 멤버의 캡슐화에 영향을 주지만 않으면 된다)
WebBrowser 관련 기능 구현에 있어 패키징 유연성이 높아진다.
컴파일 의존도를 낮출 수 있고,
WebBrowser의 확장성을 높일 수 있다.
네임스페이스(namespace)는 클래스와 달리, 여러 개의 소스파일에 나누어질수 있다
그래서,
여러 편의 함수들의 목적에 따라 헤더파일을 구분하되,
하나의 네임스페이스 안에 넣어놓자는 의미이다
// webbrowser.h
namespace WebBrowserStuff {
class WebBrowser { ... }; // 핵심 관련 기능
...
}
// webbrowserbookmarks.h
namespace WebBrowserStuff { // 즐겨찾기 관련 편의 함수들
...
}
// webbrowsercookies.h
namespace WebBrowserStuff { // 쿠키 관련 편의 함수들
...
}
이렇게
목적에 따라 헤더파일을 분리해놓으면
내가 즐겨찾기 관련 기능만 필요하다면 webbrowserbookmarks.h
만 include하면 되는거니까
너무 굿.
이렇게 하면
이 namespace에 원하는 비멤버 비프렌드 함수만 추가해주면 된다.
클래스는 클래스 정의 자체를 확장할 수 없으니
easy~
😊
오우
비멤버 비프렌드 함수라니!
프렌드 함수는,.. 자주 사용하지는 않던 개념이었다
그래서 약간 낯선,,감이 있었다
더 친근하게 놀아주장