KoreanFoodie's Study
Effective C++ | 항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자 본문
Tutorials/C++ : Advanced
Effective C++ | 항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자
GoldGiver 2022. 10. 25. 16:14
C++ 프로그래머의 필독서이자 바이블인, 스콧 마이어스의 Modern Effective C++ 를 읽고 기억할 내용을 요약하고 있습니다. 꼭 읽어보시길 추천드립니다!
항목 23 : 멤버 함수보다는 비멤버 비프렌드 함수와 더 가까워지자
핵심 :
멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰자. 캡슐화 정도가 높아지고, 패키징 유연성도 커지며, 기능적인 확장성도 늘어난다.
웹 브라우저에서 캐시를 비우는 함수, URL 기록을 없애는 함수, 쿠키를 제거하는 함수가 있다고 하자. 세 동작을 동시에 하도록 만드는 함수를 정의할 때, 멤버 함수로 만드는 것이 좋을까, 비멤버 함수로 제공하는 것이 더 좋을까?
class WebBrowser
{
public:
void clearCache();
void clearHistory();
void removeCookies();
// 1. 멤버함수 - 위 함수 3개 호출
void clearEverything();
};
// 2. 비멤버함수 - 함수 3개 호출
void clearBrowser(WebBrowser& wb)
{
wb.clearCache();
wb.clearHistory();
wb.removeCookies();
}
일반적으로 2번, 비멤버함수를 사용하는 것이 더 낫다!
일단, 캡슐화의 관점에서 보면 clearBrowser 를 비멤버함수로 두는 것이 더 낫다. 왜냐면 멤버함수가 아니기 때문에 수정 및 삭제 문제로부터 자유롭기 때문이다.주의해야 할 부분은, 위 내용은 '비프렌드' 함수에만 적용된다는 것이다. 프렌드 함수일 경우, 캡슐화에 영향을 끼칠 것이기 때문이다. 또한 해당 함수가 다른 클래스의 멤버가 될 수도 있고, 아닐 수도 있다는 것이다. 다음처럼 구현하면 매우 자연스러울 수 있다.
namespace WebBrowserStuff
{
class WebBrowser { ... };
void clearBrowser(WebBrowser& wb);
...
}
namespace 를 활용해서, 여러 파일에서 필요한 부분들로 함수를 쪼개 쓰면 된다! 예를 들어, 웹 브라우저 관련 기능을 추가 하고 싶으면 헤더 파일을 하나 만들고, WebBrowswerStuff 네임스페이스 를 만들어서 관련 함수를 작성하기만 하면 된다(확장성)!
'Tutorials > C++ : Advanced' 카테고리의 다른 글
Effective C++ | 항목 25 : 예외를 던지지 않는 swap 에 대한 지원도 생각해 보자 (0) | 2022.10.25 |
---|---|
Effective C++ | 항목 24 : 타입 변환이 모든 매개변수에 대해 적용되어야 한다면 비멤버 함수를 선언하자 (0) | 2022.10.25 |
Effective C++ | 항목 22 : 데이터 멤버가 선언될 곳은 private 영역임을 명심하자 (0) | 2022.10.25 |
Effective C++ | 항목 21 : 함수에서 객체를 반환해야 할 경우에 참조자를 반환하려고 들지 말자 (0) | 2022.10.25 |
Effective C++ | 항목 20 : '값에 의한 전달' 보다는 '상수객체 참조자에 의한 전달' 방식을 택하는 편이 대개 낫다 (0) | 2022.10.25 |
Comments