멤버 함수 보다는 비멤버 비프렌드 함수와 더 가까워지자.
웹브라우저를 나타내는 클래스가 있다.
이 클래스에는 캐시를 비우는 함수, URL 기록을
없애는 함수, 쿠키를 제거하는 함수가 있다.
이 세 동작을 한꺼번에 하고 싶은 사용자를 위해
세 함수를 불러주는 함수도 준비해 둘 수 있을 것이다.
![]()
class Web{
private:
...
public:
...
void clearEverything();
}
위와 같이 멤버함수로 제공해도 되지만,
비멤버 함수로 제공해도 된다.
void clearWeb(Web& wb){
wb.fct1();
wb.fct2();
...
}
멤버 버전인 경우 Web 클래스의 private 멤버에
접근할 수 있다. 따라서 캡슐화의 정도가 낮아진다.
반면 비멤버 비프렌드 함수일 경우 Web클래스의
어떠한 private 멤버에 접근할 수 없다.
또한 패키징 유연성과 확장성을 높히는 동시에
컴파일 의존도도 낮출 수 있다.
![]()
주의해야 할 점은 함수는 어떤 클래스의
비멤버가 되어야 한다는 말이 그 함수는
다른 클래스의 멤버가 될 수 없다라는 의미가
아니라는 것이다. 위의 clearWeb라는 함수는
다른 클래스의 정적 멤버함수로 만들어도 된다.
(Web클래스의 멤버만 아니면 됨)
![]()
더 나아간 방법 --> 같은 네임스페이스 안에 두는 것
namespace WebStuff {
class Web { ... };
void clearWeb(Web& wb);
...
}
네임스페이스는 클래스와 달리 여러 개의
소스 파일에 나뉘어 흩어질 수 있다.
clearWeb같은 함수는 편의상 준비한 함수들
이기 때문에, 이 함수가 없다해도 사용자는
각각의 함수들을 따로 호출하면 된다.
![]()
편의 함수가 많이 생길 수 있는 클래스라면
연관이 있는 편의 함수를 하나의 헤더 파일에
몰아서 선언하고, 같은 네임스페이스에 넣어주자.
//"web.h"
namespace WebStuff {
class Web { ... };
...
}
//"bookmark.h"
namespace WebStuff {
...
}
//"cookies.h"
namespacce WebStuff {
...
}
이렇게 하면 필요한 기능에 대해서만
include해서 사용하면 되기 때문에
필요없는 기능들에 대한 컴파일 의존도를
낮출 수 있다. 클래스의 멤버함수일 경우
이런 식으로 기능을 쪼개는 것 자체가 불가능하다.
하나의 클래스는 그 전체가 통으로 정의되야 하고
여러 조각으로 나눌 수가 없기 때문이다.
![]()
편의 함수 전체를 여러 개의 헤더 파일에
나누어 놓으면 확장도 손쉬워진다.
해당 네임스페이스에 비멤버 비프렌드 함수를
원하는 만큼 추가해주면 끝난다.
![]()
POINT!!
멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰도록하자.
캡슐화 정도가 높아지고, 패키징 유연성도 커지며, 기능적인 확장성도 늘어난다.
'C++ 심화' 카테고리의 다른 글
| [C++] 객체에 대한 핸들 반환 (0) | 2017.01.06 |
|---|---|
| [C++] 변수의 정의는 최대한 늦추자. (0) | 2017.01.05 |
| [C++] 데이터 멤버의 선언 (0) | 2016.12.29 |
| [C++] 함수에서의 객체 참조자 반환 (0) | 2016.12.28 |
| [C++] 값에 의한 전달, 상수객체 참조자에 의한 전달 (0) | 2016.12.27 |