본문 바로가기
NC University/Advanced C++

6일차 - 단위전략 기반의 클래스 디자인

by 날쑤 2015. 11. 24.

Intro

  아래는 간단한 List 클래스의 일부와 이 클래스를 사용하는 코드이다. 다음의 코드에서 문제점이 무엇인지를 생각해보자.

  위의 코드에서 g_list는 전역변수이므로 다중 스레드 환경에서는 thread-safe 하지 않다. 이를 보완하기 위해 push_front 함수에 동기화 코드를 추가시키는 것이 좋아 보일 수 있다. 하지만 이러한 선택은 다중 스레드 환경에서 thread-safety를 보장받을 수는 있지만, 반대로 단일 스레드 환경에서는 오히려 불필요한 operation때문에 성능저하가 발생한다. 바람직한 해법 중에 하나는 동기화 코드 사용여부를 클래스 사용자가 결정할 수 있도록 클래스를 설계하는 것이다. 물론 이로 인한 성능저하는 없어야 한다.

단위전략 기반의 클래스 디자인

  단위전략(policy) 클래스는 매우 단순한 동작이나 구조만을 갖는 작은 클래스이다. 그리고 이러한 클래스들을 모아서 복합된 기능을 하는 새로운 클래스를 만들어내는 기법이 바로 단위전략 기반의 클래스 디자인 방식이다. 이 때 클래스들의 조합은 어떠한 틀 안에서 일어나며, 조합에 사용되는 단위전략 클래스들은 이 '틀'에 부합하는 규칙을 따라야 한다. 이를 그림으로 도식화하면 다음과 같다.

단위전략 기반의 클래스 디자인

  '단위전략' 은 자료형보다는 위에서 언급한 '규칙'과 같은 개념적인 것이다. 앞의 그림을 이용해서 설명하면 만들고자 하는 구조물(host class)은 4개의 도형으로 구성되도록 정해져있다. 여기서 각 도형의 모양이 단위전략(policy)에 대응된다. 그리고 하나의 단위전략이 주어졌을 때 위의 그림과 같이 그 구현(색깔이 다른)은 무수히 많이 존재할 수 있다. 이러한 단위전략에 대한 각각의 구현물이 바로 단위전략 클래스(policy class)이다.

  다시 C++ 코드로 돌아와서 설명하면 단위전략은 고전적인 인터페이스(순수 가상함수들의 집합)와는 달리 구현시에 문법적으로 어떠한 함수가 필요한지만을 규정한다. 예를 들면, 어떤 단위전략이 T타입의 포인터를 반환하는 MakeT라는 함수를 규정했다면, 이를 구현하는 단위전략 클래스들은 단지 약속된 것과 동일한 시그니쳐의 함수들을 가지고 있기만 하면 된다. 이 함수가 굳이 비정적 멤버함수일 필요가 없으며, 내부에서 어떠한 작업이 수행되는지에 대해서도 단위전략은 별다른 제약을 두지 않는다. 실제로 이 함수들이 어떠한 일을 할지는 각 단위전략 클래스의 구현에서 결정되며, 사용자는 자신들의 요구에 부합하는 단위전략 클래스를 가져다 쓰면 된다.

  이제 이 디자인 패턴을 적용해서 처음의 List 클래스에서 문제가 되었던 부분을 개선해보자. 우선 처음의 List 클래스를 host class로 해서 ThreadModel이라는 단위전략을 추가한다. 이 단위전략은 구현체가 Enter와 Leave, 2개의 함수를 가질 것을 요구하지만, 이 함수들 내에서 어떠한 작업이 일어나야 하는지에는 관여하지 않는다. 호스트 클래스인 List 클래스에서는 템플릿 타입 인자로 받은 단위전략 클래스의 Enter와 Leave 함수를 각각 기존의 함수의 시작과 끝에서 호출하도록 코드를 수정해서 사용자의 선택에 따라 해당 함수(push_front)가 다르게 동작할 수 있도록 한다. 아래의 코드는 위의 내용을 반영한 수정된 List 클래스이다.

  여기서는 List 클래스가 단위전략인 ThreadModel을 상속받는 것으로 구현했는데, 단위전략 클래스를 상속이 아닌 has-a 관계로 사용해도 상관이 없다. 이를 위해서는 ThreadModel 타입의 멤버변수를 List 클래스 내에 정의한 후에, 두 함수(Enter/Leave)를 이 변수를 통해서 호출하는 것으로 수정하면 된다.

  한편, 위의 코드에서는 List 객체를 생성할 때 어떠한 동기화 기법을 사용할 것인지를 사용자가 선택(특정한 단위전략 클래스를 지정)할 수 있게 되었다. 또한, 이 결정은 컴파일 시간에 일어나며 추가적인 함수 호출은 인라인 치환되기 때문에 실행시간에는 어떤 성능저하도 발생하지 않는다.

'NC University > Advanced C++' 카테고리의 다른 글

1일차 - TypeTraits  (3) 2021.06.14
1일차 - Template 부분 전문화  (0) 2021.06.14
6일차 - thin template  (0) 2015.11.04
6일차 - CRTP (Curiosly Recurring Template Pattern)  (0) 2015.10.30
6일차 - checked delete  (0) 2015.10.21