[Effective C++] #23 비 멤버, 비 프렌드 함수
Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목 23 "멤버 함수보다는 비 멤버 비 프렌드 함수와 더 가까워 지자"에 해당하는 내용입니다.
비 멤버 함수
class WebBrowser
{
public:
...
void clearCache();
void clearHistory();
void clearCookies();
void ClearBrowser(); // 멤버 버전의 clear 함수
...
};
void ClearBrowser(WebBroswer& wb) // 비 멤버 버전의 clear 함수
{
wb.clearCache();
wb.clearHistory();
wb.clearCookies();
}
객체 지향 방법의 코드 작성은 데이터 캡슐화의 최대화를 강조합니다. 앞서 살펴본 접근 제어 항목에서 설명한 "캡슐화"의 연장선으로, 멤버 함수의 사용과 비 멤버 함수의 사용을 살펴보겠습니다. 비 멤버 함수의 사용은 패키징 유연성 향상의 이점을 갖고 있으며, 컴파일 의존도 또한 낮추고, 확장성을 높이는데 유용합니다. 그 이유는 비 멤버 함수는 객체의 private 데이터 멤버에 직접적으로 접근하지 않고, 해당 클래스에 대한 캡슐화 정도 또한 향상합니다. 위 예제 코드처럼, 비 멤버 함수를 외부에 정의하는 방법도 존재하지만, 우리는 멤버 버전의 clear 함수를 비 멤버 함수로 두는 다른 방법을 아래에서 살펴보겠습니다.
namespace 사용
#include "WebBrowser.h" // WebBroswer 클래스와 관련된 내용을 갖고 있는 헤더 파일
namespace AboutWebBroswer
{
class WebBroswer{...};
void clearWebBroswer(WebBrowser& wb);
...
}
WebBroswer 클래스에 대한 헤더 파일을 포함하고, namespace를 사용해 WebBrowser 관련한 함수들을 정의합니다. WebBroswer 클래스의 멤버가 아니면 된다는 가정하에, namespace를 이용해 편의를 제공할 수 있는 해당 클래스 관련한 함수들을 "namespace AboutWebBrowser"에 모아 두면 실제 사용자가 사용하는 구성 요소들만 컴파일 의존성을 고려할 수 있게 됩니다. 추가적으로, 각 기능들을 각각의 헤더 파일들로 만들어 분리해두면 컴파일 의존성을 낮출 수 있게 되죠. 예를 들면, C++ 사용자는 잘 알고 있는 <vector>, <string>, <algorithm>... 등 필요한 기능만 #include 하여 컴파일 의존성을 줄이는 방법을 사용하는 것과 같습니다. 정리하자면, 동일한 namespace(AboutWebBrowser)와 여러 개의 헤더 파일에 나누어 놓는다면, 컴파일 의존도를 낮추고, 확장성 또한 보장 받을 수 있습니다.
비 멤버, 비 프렌드 함수의 사용은 캡슐화 정도의 향상, 패키징 유연성 향상, 그리고 확장성 또한 늘어납니다.
'언어 > Effective C++' 카테고리의 다른 글
[Effective C++] #35 Public 가상 함수의 대안, NVI, 전략 패턴 (0) | 2022.02.03 |
---|---|
[Effective C++] #34 사용자 정의 기본 멤버 함수 (0) | 2022.01.31 |
[Effective C++] #22 클래스 데이터 멤버, 접근 제어, 접근 지정자 (0) | 2022.01.28 |
[Effective C++] #21 함수의 객체 반환, 참조자 반환 (0) | 2022.01.27 |
[Effective C++] #20 값에 의한 전달, 참조자에 의한 전달 (0) | 2022.01.24 |