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

수민이슈·2023년 3월 27일
0

Effective C++

목록 보기
23/30
post-thumbnail

스콧 마이어스의 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 멤버의 캡슐화에 영향을 주지만 않으면 된다)

패키징 유연성(packaging flexibility) 향상

WebBrowser 관련 기능 구현에 있어 패키징 유연성이 높아진다.

컴파일 의존도를 낮출 수 있고,
WebBrowser의 확장성을 높일 수 있다.


🖊️ 하나의 namespace에 넣어놓고 헤더 파일을 분리해서 관리하자

하나의 namespace

네임스페이스(namespace)는 클래스와 달리, 여러 개의 소스파일에 나누어질수 있다
그래서,
여러 편의 함수들의 목적에 따라 헤더파일을 구분하되,
하나의 네임스페이스 안에 넣어놓자는 의미이다

헤더파일 분리

// webbrowser.h
namespace WebBrowserStuff {
	class WebBrowser { ... };		// 핵심 관련 기능
  	...
}

// webbrowserbookmarks.h
namespace WebBrowserStuff {			// 즐겨찾기 관련 편의 함수들
	...
}

// webbrowsercookies.h
namespace WebBrowserStuff {			// 쿠키 관련 편의 함수들
	...
}

이렇게
목적에 따라 헤더파일을 분리해놓으면

장점

컴파일 의존성 낮출 수 있다

내가 즐겨찾기 관련 기능만 필요하다면 webbrowserbookmarks.h만 include하면 되는거니까
너무 굿.

이렇게 하면

편의 함수 확장이 쉽다

이 namespace에 원하는 비멤버 비프렌드 함수만 추가해주면 된다.
클래스는 클래스 정의 자체를 확장할 수 없으니
easy~


😊

오우
비멤버 비프렌드 함수라니!
프렌드 함수는,.. 자주 사용하지는 않던 개념이었다
그래서 약간 낯선,,감이 있었다
더 친근하게 놀아주장

0개의 댓글