* 리뷰를 하며 느낀 점
뇌를 자극하는 시리즈를 IT 쿡북 시리즈와 더불어 한빛미디어 시리즈 책 중 하나입니다.
C언어, C++, 자료구조, 알고리즘, TCP/IP, 시스템 프로그래밍 등 학부 때 전공 필수 과목을 들으며 함께 해왔고,
제 방 책장 한 켠을 굳건히 지키고 있습니다.
이번에 리뷰하게 된 책은 STL과 관련된 내용입니다. STL은 Standard Template Library의 약자로
사실 학부 때는 STL을 거의 사용해 보지 못했습니다. 대학원 준비를 하며 논문과 관련된 네트워크 시뮬레이터 코딩을
하면서 STL을 매우 자주 사용하고 접하게 되었습니다.
사실 STL을 쓰면 코딩이 이렇게 편리해지는지 전에는 잘 알지 못했습니다. 그러나 확실히 사용한 후부터는
기본적인 자료구조/알고리즘 내용은 알고 있기 때문에 바로 STL을 사용해서 구현하고 빠르게 확인이 가능해졌습니다.
일일이 스택, 큐, 리스트 등을 구조체/클래스로 선언하지 않고 반복적으로 코딩을 해서 사용할 필요가 없기 때문에
(바로 라이브러리를 가져다 쓰면 되므로) 사용해 본 사람만이 그 편리함을 잘 알 수 있습니다.
따라서 자료구조와 알고리즘을 공부한 학부 3,4학년이라면(물론 그 전에 이해한다면 좋겠지만^^;)
반드시 STL을 사용하여 게임 프로그래밍이나 기타 프로젝트 수업에서 유용히 사용할 수 있을 것입니다.
* 책 내용
STL은 몇 년 전이나 지금이나 크게 달라지지 않았습니다. 컴파일러에서 지원하는 차이가 있을 수 있지만,
기본적으로 사용되는 컨테이너(라이브러리)들이 정해져 있습니다. 이러한 STL을 학습하기에 앞서
C++에서 반드시 알고 넘어가야 할, 그리고 어려운 부분에서 속하는 오버로딩, 템플릿 등의 내용을 먼저 소개하고
있습니다.
그리고 이러한 C++을 기반으로 STL에 대한 내용을 차례대로 설명하고 있습니다.
STL에 대한 소개 및 각종 컨테이너에 대한 설명과 그림, 예제 코드를 담고 있습니다.
* 전체 구성 및 내용 정리
1) 연산자 오버로딩 2) 함수 포인터
3) 함수 객체 4) 템플릿
-------------여기까지는 STL과 관련된 C++ 내용
5) 시퀀스 컨테이너 6) 연관 컨테이너
7) 알고리즘 8) STL 함수 객체
9) 반복자 10) 컨테이너 어댑터
11) string 컨테이너
<1~4장>
STL에 본격적으로 들어가기 앞서 STL을 사용하면서 많이 활용하게 되는 C++ 문법들을 언급하고 있습니다.
연산자 오버로딩, 함수 포인터, 함수 객체, 템플릿 등 C++에서 어렵다고 생각되는 부분이기 때문에 반드시 짚고 넘어가야 합니다.
1장 - 연산자 오버로딩의 경우 게임에서 많이 사용되는 Point 객체의 연산을 이용하고 있고, C++에서 나오는 연산자 오버로딩 부분을 전부 다루고 있어 STL의 기본 내용이 됩니다.
4장 - 그림4-1, 2과 같이 컴파일러를 언급하면서 생성된 함수들을 비교하는 것이 특징이며 템플릿을 자주 쓰지는 않더라도 반드시 동작 원리를 알고 있어야 합니다.
<5장>
STL 컨테이너에 대한 분류를 하고 있으며, 구성 요소들(컨테이너/반복자/알고리즘 등)을 차례대로 설명하고 있습니다.
특히 컨테이너에 대한 그림들(stack, vector 등)이 자세하게 그려져 있어 예제코드와 함께 이해가 쉽습니다.
그리고 1~5, 10~50 등 동일한 수(예제)를 사용하여 다른 컨테이너들끼리 서로 동작 원리도 비교가 가능합니다.
<6장>
본격적으로 vector부터 차례대로 설명이 시작됩니다.
첫 페이지에 주요 인터페이스와 특징을 설명하여 코딩시 쉽게 참고하고 쓸 수 있게 되어 있습니다.
(다른 컨테이너를 소개할 때도 동일하게 적용됩니다.)
실제로 코딩할 때 이러한 멤버함수들을 검색해서 많이 사용해 왔습니다.
vector의 특징이자 장점은 바로 doubling입니다. 처음에 할당된 공간을 다 차게 되면, 자동으로 해당 크기만큼
추가로 메모리를 자동으로 재할당하게 되는데 이는 컴파일러에 따라 다소 다를 수 있습니다.(p172~p173)
array를 동적으로 사용할 경우 vector를 이용하면 자동 관리가 되므로 매우 편리합니다.)
* resize()함수를 사용할 수도 있지만 늘어난 capacity가 줄어들지 않기 때문에 차이점이 존재합니다.
vector의 경우 push_back과 pop_back 등 마지막 원소에 대해서만 기본적으로 삽입/삭제가 이루어지지만,
이를 개선?한 것이 deque입니다. deque의 경우 앞과 뒤에서 자유롭게 삽입/삭제가 가능합니다.
list의 경우 주로 트리에서 유용하게 쓸 수 있습니다. 노드는 원소값과 포인터를 선언해서 사용하는데 를 쓰면 관리가 편리합니다. 또한, vector, deque에 비해서 사용할 수 있는 멤버함수가 다양한 것이 특징입니다.
특히 특정 위치에 삽입/삭제할 때는 배열 기반 컨테이너보다 이러한 노드 기반 컨테이너가 성능 관점에서 매우 우수합니다.(배열은 뒤로 밀거나 당기는 동작이 수반되기 때문에 time complexity가 달라짐)
<7장>
연관 컨테이너는 균형 이진트리 형태로 관리가 되며, 키 값을 가지고 앞뒤 관계(키값의 크기)를 따져보는 컨테이너입니다.
set과 map이 있으며, set은 차례대로 키를 삽입할 수 있으며, 중복 키 값은 허용하지 않습니다.
map은 키와 value를 같이 저장할 수 있으며, 중복 키를 허용하기 위해서는 각각 multiset, multimap을 사용할 수 있습니다.
<8장>
algorithm의 경우 많이 사용해보지 않은 컨테이너입니다.
min, max, 특정 값을 search하거나 count 등을 할 수 있는 함수들을 제공합니다.
그리고 직접적으로 해당 원소값을 수정할 수 있는 멤버함수도 제공하며 copy, replace, fill, swap 등의 함수가 있습니다.
또한 변경/정렬 형태의 알고리즘도 추가적으로 제공하는데,
heap 같은 경우 자료구조 수업 시간에 일일이 구현을 해야했지만,
<9장>
STL 함수 객체는 지금까지 사용해온 STL에서 거의 안 써본 부분입니다.
<10장>
iterator의 경우 for문과 같은 반복문에서 사용할 수 있으며, 특히 vector를 사용시 많이 쓰입니다.
배열 형태로 인덱스 접근도 가능하지만, begin과 end를 이용한 반복자를 이용한 방법도 많이 사용됩니다.
<11장>
컨테이너 어댑터에서는 stack/queue/priority_queue에 대한 간단한 설명으로,
역시 자료구조를 통해 직접적으로 구현할 필요없이 바로 이 컨테이너들을 사용하면 유용합니다.
<12장>
string 컨테이너는 일반적으로 STL의 큰 범주에는 포함되지 않지만, C++ 코딩할 때도 많이 사용되는 라이브러리입니다.
char 배열의 크기를 지정하여 선언하거나 동적으로 관리할 때 모두 불편하고 null문자도 고려해야 하는 등 다소 어렵습니다.
strcpy, strcat 등 함수들도 다 알아야 합니다. 그러나 string 컨테이너를 선언해 쓰면 제공하는 멤버함수를 통해
폭넓게 string(문자열)을 관리할 수 있습니다.
* 좋은 점
1) 칼라로 인쇄되지는 않았지만 공부하기에는 이런 책이 더 우수하다고 생각합니다.
특히 코드 부분이 많기 때문에 눈의 피로가 적습니다.
2) 비슷한 예제들(코드)을 반복적으로 사용하고 짧게 짧게 연습해 보면서 필요한 내용들을 학습할 수 있습니다.
3) STL을 처음 접하는 독자의 경우 다소 개념적으로 어려울 수 있는데
항상 예제 코드와 자세한 동작 그림을 포함시켜 쉽게 이해할 수 있도록 돕고 있습니다.
* 아쉬운 점
STL을 공부하는데는 매우 유용한 책임은 분명하지만, 마지막 한 챕터 정도는
이러한 컨테이너들을 복합적으로 사용하는 간단한 프로젝트 정도를 넣었으면 더 좋지 않을까 생각하였습니다