멤버 함수보단 비멤버 비프렌드 함수를!(effective c++ 23)

2015. 8. 25. 16:54프로그래밍/Effective C++

728x90
728x90

클래스에서 여러 함수를 호출해야 할 때, 함수들을 모아서 불러주는 함수를 만들 수 있다.


예시



해당 클래스의 클리어에 관련된 모든 함수를 호출하는 함수를 만들고 싶다.


1안은 멤버 함수로 2안은 비멤버 함수로.


비멤버 함수의 이점

캡슐화! 함수가 보이지가 않아요!

 - 어떤 것을 캡슐화하면, 외부에서 이것을 볼 수 없게 된다.

 - 그렇게 되면 (변경 자체가 영향을 줄 수 있는 범위가 ‘변경된 것을 볼 수 있는 것들’로 한정되기 때문에) 

그것들을 바꿀 때 필요한 유연성이 커진다.

 - 즉, 이미 있는 코드를 바꾸더라도 제한된 사용자들 밖에 영향을 주지 않는 융통성을 확보할 수 있다. 


패키징 유연성

 - 해당 클래스의 관련된 기능을 구현하는 데 있어서 패키징 유연성(packaging flexibility)이 높아진다.


확장성
 - 패키징 유연성을 통해 컴파일러 의존도를 낮춤으로써, 확장성도 높일 수 있다.

네임스페이스를 이용


 - clearBrowser는 있어도 되고 없어도 되는

   편의 함수이기 때문에, 이것이 없을 경우에

   그냥 함수를 각각 호출해 주면 된다.


 - namespace는 여러 개의 소스 파일에 나뉘어 

   흩어질 수 있기 때문에, 편의 함수마다

   각각 다른 헤더 파일에 몰아서 선언할 수도

   있다.


 - 여러 개의 헤더 파일(단, 동일한 네임스페이스)에 나누어 놓으면 확장도 손쉬워진다.


C++의 라이브러리

 C++의 라이브러리가 이러한 구조로 구성되어 있다.

 - namespace std에 속한 함수들이 한 헤더에 들어가 한 통으로 섞여 있지 않고,

 - 몇 개의 기능과 관련된 함수들이 수십 개의 헤더에 흩어져 선언되어 있다.

 - 필요한 헤더만 선언한 후, 필요한 기능만 사용할 수 있기 때문에

   사용자가 실제로 사용하는 구성요소에 대해서만 컴파일 의존성을 고려할 수 있게 되었다.

   클래스는 분할이 되지 않으므로 클래스 멤버 함수는 상상도 할 수 없는 일이다.


정리

 - 멤버 함수보다는 비멤버 비프렌드 함수를 자주 쓰도록 하자!

 - 캡슐화 정도가 높아지고,

 - 패키징 유연성도 커지며,

 - 기능적인 확장성도 늘어난다.


728x90
반응형