C++: STL

C로 시작해서 C++로 옮겨간 사람의 입장에서 보면 STL은 좀 생소한 개념일 수 있다. Standard Template Library라고 해서 이름은 다소 거창해 보일 수 있는데, 사실 대단하게 보면 대단할 수 있고 아니려면 아닐 수도 있는 것 같다.

기본적으로 C++는 template를 지원한다. template라는 것은 다들 잘 알겠지만 어떤 function이나 operation을 type과 상관없이, 다시 말해서 모든 type에 적용이 가능하게 하는 C++의 수법이다. 하나를 정의하면 모든 type에 다 적용이 되게 만드는, 다시 말하자면 딱 한번만 코드를 작성하면 그 코드로 모든 type에 다 울궈먹게 할 수 있는 그런 것이다.

STL은 그런 장점을 이용해서 array 같은 것을 편하게 다루게 하는 library이다.

벡터가 가장 좋은 예로 쓰여진다. 벡터를 C에서 표현하는 것은 주로 정해진 크기의 메모리를 잡아놓고 그 안에 데이터를 넣어두고 응용하는 방법인데, STL에서는 그 메모리의 크기를 맘대로 늘렸다 줄였다 하기도 하고 중간에 데이터를 삽입하기도 하고 별도의 알고리즘을 정의해서 sorting을 하게 할 수도 있다.

template이라는 장점을 이용해서 수많은 type에 코드를 재작성할 필요없이 다 적용해 볼 수도 있다.

이게 STL에 대해서 할 수 있는 설명이다.

왜 STL을 써야 되느냐 물어보면, 이게 편하기 때문이다. 언어적으로. 편하다는 게 작성만 편한게 아니라 혹시나 벌어질 run-time 상황에서 memory management때문에 발생하게 될 문제를 확실히 줄일 수 있다.

STL이 어떻게 구현되어있는지 열어보지 않아서 모르겠으나, insert가 가능하다거나 begin/end 같은 것들이 별도로 구현되어있는 것을 보면 linked list 이런 류가 아닐까 생각해본다. 따라서 선형 memory를 이용해서 데이터를 읽고 쓰는 것에 비해 느리지 않을까 하는 생각도 해보는데, 그것까지 다 열어서 확인해보고 한다면 STL을 쓰는 이점은 없어진다. 편하자고 쓰는 것을 뚜껑 열어서 다 확인해 볼 필요까진 없다고 본다. 또 STL은 나온지도 오래되고 사용이 보편화된 것이라 implementation을 허술하게 해놓았을리 없다. 빠르게 잘 만들어놔서 속도가 느려지지 않을까 하는 걱정도 할 필요가 없다.

만에 하나 속도가 느리면 어떠냐. 그래봐야 개찐 도찐이고 빠른 방법으로 한답시고 안정성을 떨어뜨리면 그게 훨씬 더 큰 문제가 된다. 그러나 절대로 느리지 않다.

C++을 사용하는 것은 예전처럼 (속도나 프로그램 크기의) 부담을 떠안는 일이 아니라 지금은 가장 빠르고 효과적인 방법 중 하나가 되었다. 많은 양의 데이터를 편하게 관리하고 싶으면 STL을 쓰는 것도 좋은 방법이다. malloc/free 혹은 new/delete로 단순하게 메모리를 잡아서 쓰는 것이 어찌보면 ‘정석’에 가까운 일이라고 하더라도 다양한 타입의 데이터를 다뤄야 하거나 들어오고 내보내고 하는 데이터의 양이나 경우가 너무 다양하다고 하면 STL을 쓰는 것이 훨씬 fail-safe하다. 다루기 쉽고 코드도 깔끔하고 읽기 좋게 되는 것은 말할 필요도 없다.