클래스 디자인 문제인 operator<<() 를 작성하는 가장 좋은 방법은 ① 자유 함수로 연관 시키는것이 좋은가? 아니면 ② 클래스의 virtual Print() 보조 함수를 호출하는 자유 함수가 좋은가?

각각의 장단점은 무엇인가?

 

분석

왜 자유함수(일부 연관형으로 함수로 사용 될 함수)와 virtual 자유함수를 비교 해야만 했는지는 모르겠다. 중요한 것은 기본 전제로 "operator<< 는 멤버 함수보단, 비멤버 함수가 더 좋다"가 깔렸다는 것이다. 가상 함수 호출로 더 세밀한 조정이 필요하다면, 당연히 ②이 좋기 때문에, 적절한 비교가 아니라고 생각한다.

아마도 허브 셔터는 "이름 검색과 인터페이스"를 분석하기 위한 예제로써 비교를 한 것으로 보인다. 이름 검색과 인터페이스의 밀접한 관계에 대해서는 파트 1,2에서 설명 했고, 이번 장에선 "클래스의 인터페이스에 따른 의존성 분석"을 얘기 한다.

 

①, ② 질문을 한번 구현해 보자.





자. 이제 클래스의 인터페이스를 기준으로 두 구현에 대해서 장단점을 평가해 보자.

① 의 경우, operator<<의 구현이 X의 그 어떤 멤버 함수 ostream 을 언급하지 않기 때문에, X는 ostream에 의존적으로 보이지 않는다.(실제로 의존적이지만, 문맥상 보이지 않는다로 표현해야 한다. 아마도 오타 인듯). 또한 추가적인 가상 함수 호출에 대한 과부하를 피하고 있다.

② 의 경우, X& 형만 전달 되더라도, 파생 관계에 있는 클래스의 print 함수를 보다 정확하게 호출 할 수 있는 장점을 갖는다.

이 두 경우의 분석은, 매우 전통적인 분석이지만, 결점이 있다. 다시 한번 인터페이스 원칙을 가지고 평가해 보자.
  1. 인터페이스 원칙에 따르면, operator<<는 X를 두 경우 다 언급하고, 제공 받기 때문에, 논리적으로 X의 일부이다.
  2. 두 경우 모두 operator<<는 ostream 을 언급하기에, operator<<는 ostream에 의존하고 있다.
  3. 1. 2. 이므로 둘다 X가 ostream 에 의존하고 있다.
그러므로 ① 의 장점 중, 의존적이지 않다는 것은 잘못된 것이고, 유일한 장점은 가상 호출의 과부하를 피할 있다가 된다. (물론 클래스 세부 설계로 들어가는 부분이지만 일단 넘기자. 지금은 인터페이스에 따른 클래스 의존성 분석에 있으니...)

결국 의존성 분석할 때 멤버들과 비멤버들로 구분 짓는 것은 항상 유용하지 않다는 것이 인터페이스 원칙이 의미하는 바이기도 하다.

총평

인터페이스 원칙으로 시작된 클래스 의존성 분석은 클래스를 만들 경우 의존성을 최대한 줄이는 일반적인 방법론에 일침을 가하고, 보다 주의깊게 의존성을 분석할수 있게 알려주는 항목이다.


  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 라이프코리아트위터 공유하기
  • shared
  • 카카오스토리 공유하기