오늘은 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 가 수행할 수 있는 직업을 확실히 제어할 수 있다는 점이 배워갈 부분이라고 생각합니다.
'활동·스터디 > 컴퓨터공학' 카테고리의 다른 글
[NVIDIA] HCLS Summit Korea 2022 내용 일부 정리 및 후기 (0) | 2022.04.29 |
---|---|
자연어 처리 분야 최신기술! Transformer model, BERT, XLM 모델이란? (0) | 2022.01.05 |
Adaboost Algorithm 파이썬으로 구현하기 (단순사용X!) (0) | 2021.12.07 |
내가 보려고 쓰는 유용한 리눅스 명령어 (0) | 2021.11.18 |
[Docker] #1. 간단한 DockerFile 만들어서 DockerHub에 올리기 (0) | 2021.10.25 |