내가 C++에 조예가 깊어서 글을 남기는 것이 아니라, Effecitve C++ 을 공부하는 사람들이 이 글을 보고, 도움이 되었으면 하는 생각과, 혹시 내가 틀린것이 있다면 지적해 주시지 않을까 란 생각으로 글을 올리는것임을 미리 밝힙니다.  - 최익필


항목 47에서는 "타입(int, 사용자정의 class등)을 확인 방법으로 특성정보 클래스를 이용하는게 더 좋다."를 주제로 이야기가 진행 된다.

나의 경우, 내가 정의한 클래스에 대해서 타입을 확인하여, 해당 타입에 맞게 초기화를 하는 로직으로 코딩을 했었다. 막상 타입을 확인하는데 특정 변수를 두어, switch 문으로 분기시키어, 초기화를 했었는데, 이게 새로운 클래스가 생긴다거나, 초기화를 해야 했을때, 명시적으로 뒤에 타입을 정해주어야 한다는 불편함이 있었다.

하지만 이번 장에 소개된 기법(C++ 에서 별도로 타입확인 연산자 typeid를 제공하긴 하나, 성능이 dynamic_cast급으로 나온다는 문제점이 지적되곤 한다. 그래서 프로그래머들의 기법으로 소개가 된다.)을 이용하여, 보다 빠르게 타입을 확인하고, 위에서 겪었던 문제점을 타파할 수 있었다.


우선 .. 소개하기에 앞서, 재미있는 STL 반복자에 대해서 이야기 해보자. 우선. 그림과 표로 된것을 보고 설명하는것이 더 편할듯 보여, 그림과 표를 준비하였다. 물론.. http://www.cplusplus.com/reference/misc/iterator/ 에 있는 내용이다.

사용자 삽입 이미지
Iterator를 분류하자면 5분류를 할수 있다. 위의 그림을 봐도 5개가 있듯이 말이다.

이 중
1. input, output iterator 는 iterators 중 제일 제한적인 기능을 가진다. 오로지 한번에 앞으로 한칸씩만 전진이 가능하고, 입출력 반복자이다.

2. Forward iterator는 우리나라 말로 해석되면 "순방향 반복자"로 표현된다. 순방향 반복자는 input, output iterator가지는 기능을 모두 가지고 있고, 전진 방향으로만 이동 될 수 있다.

3. Bidirectional iterator우리말로 해석되면, "양방향 반복자"로 표현된다. 양방향 반복자는 Forward iterator에서 후진 기능만 추가 한것이다. 대표적으로 list 의 iterator 가 여기에 속한다.

4. 마지막으로 최고로 막강한 RandomAccess Iterator 를 들 수 있다. 이 iterator는 지금까지 말한 모든것을 포함한 상태에서 추가로 반복자 산술 연산(iterator arithmetic)기능이 추가된것이다. 그러니까 원하는 거리로 마음데로 갈수 있다 마치 배열처럼... 대표적으로 vector 와 deque string을 들 수 있다.

뭐.. 표로써 표현하자면 아래..
사용자 삽입 이미지
이런 식으로 나타낼 수 있다.

이런 iterators은 유용하게 사용하는데, 경우에 따라서 원하는 위치로 변경을 해줄 경우가 생긴다. 이 때를 위하여, 이런 iterator를 매개변수로 받아 입력받은 iteartor를 원하는 위치로 변경 시켜주는 advance 템플릿 함수가 있다. 곰곰히 생각해 보면 random Access 가 지원되는 iterator를 받으면, random Access를 하고, 그것 외의 iterators는 후위연산이나 전위연산으로 이동 시키면 제일 좋을 것이다..

.. 아마도 iterator로 설명을 하게 되면, 좀 어려워질 것 같아. 다른 예를 들어서 해보겠다.
내가 정의한 템플릿 클래스가 있다. 이 템플릿 클래스에의 타입에 따라 처리하는게 다르다. 그래서 타입 별로 분기를 시키켜서 초기화 함수를 호출하면 될 것 같다. 그런데 .. 어떻게 호출을 분기하지?


이렇게 처리 하면 될 것 같은데, 어떻게 if else 문으로 타입을 확인 할수 있을까? 또는 대체 할수 없을까? 곰곰히 생각해 보게 된다.

if로 확인하려면 typeid() 연산자를 이용하여 == != 를 사용하면 되는데, 이런것이 런타임에 결정되기 때문에, 필요없는 비용을 지불해야 한다. if로 확인 안하고 컴파일 단계에서 바로 호출하는 형식으로 하면 좋지 않을까?.. 그래서 이렇게 짜면 된다.


이게 개념인데. 설명을 못하겠다. 아무래도 .. 깊게 들어가지 못한 듯 하다. 비유를 들자면 좋은게 있을려나..이것만은 잊지 말자!

1. 특성정보 클래스는 컴파일 도중에 사용할 수 있는 타입 관련 정보를 만들어 낸다.
2. 함수 오버로딩 기법과 경합하여 특성정보 클래스를 사용하면, 컴파일 타임에 결정되는 타입별 if...else 정검문을 구사할 수 있다.

신고
posted by 농사를 짓는 게임 프로그래머 최익필

댓글을 달아 주세요