오늘은 Fundamentals of C++ Programming/ by. Richard L. Halterman 책의 542-544 Page 코드리뷰를 해보겠습니다.

해당 내용은 C++ 언어의 Class protection level 및 inheritance 와 관련한 내용입니다.

오늘의 코드 리뷰는 다음과 같은 순서로 이루어지겠습니다.

코드에 Class Protection level 관련한 내용이 있으므로, 먼저 Class 3가지 Protection level 살펴본 ,  Comparer(살펴볼 Class 이름입니다) 헤더파일 cpp 파일을 살펴보도록 하겠습니다.

 

클래스는 멤버함수에 대해 세가지 수준의 보호를 지원합니다.

첫번째로, Private level 있습니다. Private Class 보호수준의 기본값으로,  Class 안의 모든 코드는 Private member 엑세스할 있으나, Class 외부의 코드는 엑세스가 불가합니다.

번째로, Protected level 있습니다. Protected Private 같이 Class 안의 모든 코드가 엑세스 있으며, Class 외부의 코드는 엑세스가 불가합니다. 다만 Derived Class, 상속된 Class 엑세스가 가능합니다

세번째로, Public level 있습니다. Public 멤버는 어드 코드에서나 엑세스가 가능합니다.

 

정리하면, Private Class 외부에서 엑세스 없음을 의미하며, Public 엑세스가 가능함을 의미합니다.  Protected 하위 Class 대해 공개 다른 모든 클래스에 대해 비공개를 의미합니다.

 

오늘 리뷰할 Comparer.h 파일 .cpp 파일은 이후에 소개될 selection sort, 선택 정렬 구현에 필요한 class 만드는 내용입니다. Selection sort 관련한 내용은 다음번에 리뷰하도록 하겠습니다.

Comparer 파일은 다음의 기능을 포함합니다.

1)     선택 정렬 기능에 의해 부과된 순서는, Comparison 함수를 custom하여 변경할 있습니다.

2)     정렬 순서를 결정하는데 사용되는 object 정렬시 수행되는 비교 교환 횟수에 대한 데이터를 수집합니다.

또한 코드를 여러 소스파일로 분할하여 사용하며, 미래에 사용할 있는 두가지 Virtual 메소드를 사용합니다.

그러면 이제 Comparer 클래스의 선언이 포함되어있는 17.33 Comparer.h 파일을 간략히 살펴보도록 하겠습니다.

Comparer Class의 Private 영역에는 int 의 compare_count 와 swap_count가 있습니다.
Private 영역에 있으므로 외부에서 엑세스 할 수 없으며, compare 횟수 및 swap 횟수를 추적합니다.

마찬가지로 Private 영역에 int 2개를 input, bool type을 output으로 하는 비교를 위한 함수 포인터가 있습니다.

Protected 영역에는 실제로 비교를 수행하는 메소드인 virtual Compare_impl 함수, 실제로swap 을 수행하는 메소드인 virtual swap_impl 함수가 있습니다. Derived class는 이 두개의 함수를 custom하여 사용할 수 있습니다.

Public 영역에는 적절한 비교함수로 Comparer 객체를 초기화하게끔 하는 생성자가 있고, 새로운 정렬을 준비하기위해 그동안의 compare 및 swap counter를 0으로 만드는 reset 함수, 비교를 위해 int 2개를 받아 bool 로 반환하는 compare 함수,

Inference로 값을 받아와 해당 값을 교환시키는 swap 함수, 객체의 비교 횟수 및 swap 횟수를 반환하는 함수가 있습니다.

다음으로 cpp 파일에 대해 설명드리겠습니다.

먼저 헤더파일을 include 합니다.
#include "comparer.h"

Comparer class의 compare_impl 함수는 int 2개를 받아 판단후 bool로 반환합니다. 

Swap_impl 함수는 int 2개를 reference로 받아 m을 temp에 저장해두고, m을 n값으로 바꿔주고, n을 미리 저장해둔 m 값, 즉 temp와 바꿔줍니다.

다음은 생성자 초기화입니다. Compare_count를 0, swap_count를 0, 그리고 비교연산자 함수를 사용자가 원하는 함수로 초기화하여줍니다. 

Reset 함수는 compare_count와 swap_count를 0으로 만듭니다.

Compare 함수를 사용하면 compare_count 를 하나 올리고, compare_impl 함수를 실행하여 비교를 수행합니다. 

마찬가지로 Swap 함수를 사용하면 int 2개를 reference로 받아 swap_impl 함수를 실행하여 swap을 수행합니다. 함수가 호출되면 swap_count를 하나 올립니다. 
Compare 및 swap 메소드는 virtual 함수로 선언되지 않으므로 derived class는 재정의할 수 없고, compare_impl 및 swap_impl 만 재정의가 가능합니다.
Comparisins 함수를 호출하면 compare_count를 반환하고,  Swaps 함수를 호출하면 swap_count를 반환합니다. 

둘 모두 swap_count 와 compare_count 는 private영역에 존재하기 때문에, 이렇게 Comparer 클라스 내부에 값을 반환해주는 함수를 만들어둔것입니다.


책의 16.3절, Comparer Class 와 거의 동일한 내용이었는데요,

해당 파일과 클래스의 디자인이 달라진점은,

Private, Protected, Public 의 세가지 보호수준을 적극 이용하여 보호할 내용을 보호하고, 엑세스 할 수 있는 메소드를 지정해주었다는 점,

가상 메소드인 compare_impl 및 swap_impl을 정의하고 custom할 수 있게끔 해주었다는 점,

public의 compare 및 swap 함수가 compare_impl및 swap_impl 함수에 작업을 위임한다는 점, 등이 있습니다.

이는 count 횟수를 엄격하게 보고하기 위함이라고 볼 수 있겠습니다. (log 를 확실하게 저장)


이번 코드 리뷰에서는, Protected 및 private 지정자를 적절하게 사용하면 Class 는 drived class 가 수행할 수 있는 직업을 확실히 제어할 수 있다는 점이 배워갈 부분이라고 생각합니다.

+ Recent posts