Generic Programming in C++, Part 4

실제의 STL

실제의 STL #

다시 강조하지만 STL은 표준 라이브러리의 일부다. 그러므로 STL이란 명칭으로 표준 라이브러리의 일부를 따로 분리하여 거론하는 것은 별로 바람직 하지 않다. 다만 초기에 이러한 라이브러리를 설계하고 구현한 Alexander Stepanov가 그의 관련 논문에서 부여한 명칭을 설명의 편의를 위해 언급하는 것 뿐이므로 오해가 없었으면 한다.

사실 필자는 STL을 아주 상세하게 설명하고 싶지않다. 그 수많은 기능을 모두 알지 못하기도 하거니와 이미 잘 정리된 문서가 웹상에 널려 있으므로 그 참고자료는 아주 많은 셈이며 또 다시 여기에 반복하는 것은 지면의 낭비일 수 있다. 필자는 단지 그 활용 기법과 보완 책 기본적인 설계원칙을 설명하고자 한다. 그러므로 나머지는 독자스스로의 학습에 달려있다. 사실 STL의 학습은 MFC/OWL/VCL등의 상용 라이브러리에 비하면 훨씬 쉽고 진도가 빠르다는 점을 필자 스스로도 체험한 바 있다. 오히려 문제가 되는 점은 처음에 이 라이브러리를 접했을 때 오는 사고방식의 혼동에서 온다. 그러므로 STL을 잘 사용하고 싶은 독자라면 라이브러리가 제공하는 클래스와 클래스가 제공하는 인터페이스 등을 학습하는 것도 물론 해야 할 과정이지만 프로그래밍의 사고 방식을 STL 방식으로 변화하기 위해 노력하는 것이 더욱 중요하다. 그와 같은 사고 방식은 이미 위에서 언급한 바 있다.

이제 STL의 실제 구조를 살펴보자. 이미 언급한 바와 같이 STL은 컨테이너 – Iterator – 알고리즘 – Functor로 이루어져 있다. 우선 컨테이너의 전체적으로 살펴보자.

std::<Container> #

STL은 다수의 컨테이너 클래스를 제공한다. 모두 프로그램에 범용적으로 사용될 수 있는 부품이며 잘 설계되어 있어 편리하고 사용방법도 거의 동일하여 배우기도 쉽다. STL의 컨테이너는 크게 두 가지로 분류할 수 있으며 그 분류에 따라 제공되는 연산도 각기 제약이 있다. 먼저 원소를 초기에 삽입한 순서에 의존하여 순차적으로 저장하고 열거하는 단순한 컨테이너 – Sequence들이 있으며 자료구조를 학습한 독자라면 이미 상당히 익숙한 명칭일 것이다. <vector>, <deque>, <list>, <stack>, <queue>, <priority_queue> 등이 이에 해당하는데 파일의 이름과 동일한 명칭의 template class를 제공한다. 여기서 <stack>, <queue>, <priority_queue> 매우 특수한 Sequence이므로 이후에 별도로 설명하기로 하자. Sequence와는 달리 Key값의 관계에 따라 원소를 내부적으로 재 배치하고 다시 key값으로 원소를 열거할 수 있는 컨테이너가 제공되며 이를 associative 컨테이너라고 한다. STL이 제공하는 Associative는 <set>, <map> 두 종류이며 각각 동일한 key 값을 갖는 원소의 중복을 허락하는 <multiset> <multimap>을 부가적으로 제공하고 있다. STL이 좋은 점은 서로 다른 컨테이너라도 거의 같은 기능을 사용하는 경우 완전히 동일한 인터페이스를 제공하기 때문에 사용상의 불편한 점을 거의 느낄 수가 없다는 점이다.


Part 5로 이어집니다.