예전부터 책을 읽을때 마다 보이는 것이 특질이라는 단어 였습니다. 원어 로는 traits라고 적혀져 있더군요. 그런데 C++ 이라는 언어를 총체적으로 이해를 못해서 그런지 아니면 제가 이해를 잘 못해서 그런지는 몰라도 잘 이해가 되지 않는 부분이었습니다.
그런데 이 특질이라는 부분이 유용하게 사용되더군요. 이게 무엇인가 하면. 템플릿 특수화를 이용한 데이터 타입의 정의(?)를 통한 사용확장 이라고 생각하시면 될 것 같습니다. 적어도 저는 부족하나마 그렇게 이해했습니다.( 혹시 틀린게 있다면 댓글을 달아주세요. )
위의 코드를 보면 integer 형태의 변수 a를 통하여 aaa container 의 front 값을 받아올 수도 있고, std::vector< int >::reference 같은 것으로 인하여 데이터를 대신 받을 수 있습니다. 여기서 하나 살펴봐야 할 부분이 std::vector< int >와 같이 선언 부분에서 typename 을 다르게 주면 당연 reference 부분도 함께 바뀌어야 합니다. 그 것이 가능한 까닭은 std::vector 선언 부분을 보시면 알 수 있습니다.
바로 template 를 통한 객체의 선언에 대한 한 벌의 해석이 만들어 질 때, typedef 를 통하여 _Alloc::reference 를 Reference 로 정의해줍니다. 그럼 밖에서는 해당 클래스 내부의 refernce 로 접근을 하거나 value_type으로 접근하면 값에 대한 접근이 가능하죠. _Alloc 이라는 부분 상세한 것 까지는 저도 잘 모르는 부분이고 계속하여 보고 있는 부분이기 때문에 곧 원인이 나올 것 같습니다.
이런 부분에 대하여 typedef 가 이루어지는 것을 볼 수 있는데, 한 가지 의문이 생깁니다. 과연 이러한 많은 Container를 지원하는 함수를 만들어야 하고, 그 함수 안에서 변수를 임시로 담는다거나 하는 부분에 대해서는 어떻게 구현을 해야 하는가 입니다. 어려울 것 같지만 간단하게 구현할 수 있습니다.
std:: 표준 헤더에 이렇게 iterator_traits 가 선언되어있더군요. 템플릿 특수화를 사용하여 여러경우에 대하여 대처해놓은 것을 알 수 있습니다. 그럼 이 것으로 뭘 하면 될까요??
코드를 위와 같이 사용했을 경우 std::vector< int > 라던가 std::vector< char > 라던가 어떠한 데이터 타입에 대한 Container에 대해서 함수가 의존성을 가지지 않게 됩니다. 함수가 더욱 확장성이 있어지는 것이죠. 전의 RLE8, LZSS 인코딩 같은 경우 그 특성상 BYTE 인코딩을 전제하고 있었으므로 char 타입으로 고정시켰습니다.
하지만 이 경우는 좀 다르겠죠^^? 똑같은 코드를 바꿔서 치는 것만큼 어리석은 일은 없을거라고 생각하기 때문에 이런 방법들을 사용하여 뭔가 더욱 활용성 있고 확장성 있는 함수를 만들 수 있을것 같습니다.
"Language / C++" 분류의 다른 글
| std::ostreambuf_iterator, std::istreambuf_iterator의 이유 (1) | 2008/04/16 |
| std::auto_ptr - Smart Pointer 이지만?? (1) | 2008/04/13 |
| 더 이상 rand()는 필요없다?! - boost::random Number Library (2) | 2008/03/12 |
| TR1 Array - boost 라이브러로 사용하는 방법 (1) | 2008/03/12 |
| 일반적인 오류 - Call By Reference in C?? (6) | 2008/03/10 |

댓글을 달아 주세요
트랙백이 남겨지지 않아, 댓글로 남깁니다.^^ 재미있게 보았습니다.
잼있으셨다니 다행이네요^^.. 블로그에 방문하니 재미있는게 엄청 많으시군요^^;;
http://ikpil.tistory.com/540 관련글(...?)