언어/Effective C++

[Effective C++] #23 비 멤버, 비 프렌드 함수

Hardii2 2022. 1. 28. 14:03

[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();
}

 

 

[Effective C++] #22 클래스 데이터 멤버, 접근 제어, 접근 지정자

[Effective C++] #21 클래스 데이터 멤버, 접근 제어, 접근 지정자 Scott Meyers의 "Effective C++"를 통해, C++ 구현에 필요한 개념들을 이해하고, 기록하기 위함입니다. 해당 항목은 4장 "설계 및 선언", 항목.

webddevys.tistory.com

객체 지향 방법의 코드 작성은 데이터 캡슐화의 최대화를 강조합니다. 앞서 살펴본 접근 제어 항목에서 설명한 "캡슐화"의 연장선으로, 멤버 함수의 사용과 비 멤버 함수의 사용을 살펴보겠습니다. 비 멤버 함수의 사용은 패키징 유연성 향상의 이점을 갖고 있으며, 컴파일 의존도 또한 낮추고, 확장성을 높이는데 유용합니다. 그 이유는 비 멤버 함수는 객체의  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)와 여러 개의 헤더 파일에 나누어 놓는다면, 컴파일 의존도를 낮추고, 확장성 또한 보장 받을 수 있습니다. 

 

비 멤버, 비 프렌드 함수의 사용은 캡슐화 정도의 향상, 패키징 유연성 향상, 그리고 확장성 또한 늘어납니다.