라이브러리를 부르는 이름이 여러 개다.
표준 라이브러리를 부르는 이름이 사람마다 상이하다. 많은 사람이 표준 라이브러리, 혹은 컨테이너 부분만 따로 떼서 STL이라고 부른다. MS의 표준 라이브러리 github repo의 이름도 STL로 되어있고, MS공식 문서에서도 STL을 많이 사용되는 이름이라고 언급한다. 국내에서 유명한 책 이름에도 STL이 들어간다. 심지어, C++ 언어 창시자의 문법 서적에서도 STL이라는 용어를 사용하는 것 같다.
그런데, 누군가는 이 표현이 잘못되었다고 말한다. STL은 컨테이너 자체의 개념과 표준에 편입되기 전 컨테이너의 구현체를 말하는 것이고, 이를 표준 라이브러리의 컨테이너와는 구분해야 한다는 것이다. 실제로 ISO 표준에는 STL이라는 용어가 쓰이지 않는다. 또, 위에서 언급한 MS의 공식 문서에서도 STL을 언급하고 있을지언정 공식적인 이름으로 사용하고 있지는 않다.
처음 C++의 자료구조 라이브러리를 공부하는 입장에서는 이러한 이름 논쟁이 달갑지는 않다. 공부를 시작하기도 전에 이름에서부터 혼란이 오고, 해결하기 위해 이것저것 찾아봐야 하기 때문이다. 그래서, 세부적인 라이브러리의 내용을 다루기 전에 이러한 혼란을 우선 잠재우려고 한다. 그러기 위해서는 STL과 C++표준 라이브러리의 역사를 알아야 한다.
역사
1. C++는 자료구조를 지원하지 않았다.
최초 C++에는 배열, 구조체를 넘어가는 복잡한 자료구조를 위한 표준 라이브러리가 없었다고 한다. 세상에! 자료구조를 지원하지 않는 언어도 있다니. 현대에 이 말은 참 이상하게 들린다. 그런데, 그 현대에도 자료구조를 지원하지 않는 언어가 있다. 바로 C++의 전신인 C언어다!
보통 자료구조를 제공해 주는 현대의 언어들은 두 가지 패러다임을 포함하고 있는 경우가 많다. 바로 객체지향과 일반화 프로그래밍이다. 그런데, C언어에서는 template문법은 당연히 없고, 심지어 객체지향 언어도 아니다. 이런 패러다임이 대중적이게 된 것은 C언어가 만들어진 후 한참 뒤인 C++가 등장할 때쯤이다. 당시에 범용적인 자료구조를 구현해서 제공하기에는 제약이 너무 많을 것이다. 이러한 이유로 C에는 표준 라이브러리에 존재하지 않았고, C를 기반으로 만들어졌던 C++에도 자료구조는 없었다.
2. 일반화(Generic) 프로그래밍 연구
1970~80년, 컴퓨터 과학자 알렉산더 스테파노프(Alexander Stepanov)를 중심으로 일반화 프로그래밍이 연구되었다. 이 연구의 목표는 알고리즘의 구현과 자료구조를 추상화해서 이 둘 사이의 결합도를 끊어내는 것이었다. 데이터 타입마다 전용 알고리즘을 따로따로 구현하는 것이 아니라, 정해진 연산(인터페이스)를 만족하는 자료구조는 무엇이든 딱 한 번 구현된 (자료구조로부터 추상화된) 알고리즘 코드를 사용할 수 있도록 하는 것이다. 연구의 최초의 구현 시도는 Ada라는 언어였으나, 이 시도는 컴파일러의 한계로 실패했다고 한다.
3. STL과 C++ 표준
C++에 자료구조가 추가된 것은 1990년대 였는데, 이때 한참 ISO에서 C++의 문법을 표준화하고 있었다. 그 당시 동료에게 표준 위원회에 도움을 줄 것을 요청을 받은 스테파노프는 그간의 연구들을 집약했다. C++ templete를 이용해 일반화 프로그래밍을 구현한 자료구조를 개발하고, 이를 C++ 표준 위원회에 제안하게 된다. 이때, 제안된 개념과 구현이 바로 STL, Standard Template Library이다. C++ 표준 위원회에서는 이 제안을 적극 환영했고, STL의 주요 개념과 구조가 C++ 표준으로 편입된다. 편입된 개념은 Containers
, Algorithms
, Iterators
이다. 개념들이 표준에 편입되면서 STL이라는 용어는 표준에서는 사라졌지만, 그 당시 개발자들에 의해 구전되어 지금까지 내려와서 사용되고 있다.
결론
STL이라고 부를 수 있는 것은 C++ 표준 라이브러리의 일부분에 적용된 개념이라고 할 수 있다. 물론, 표준 외의 다른 STL 구현체가 현재까지 유지되지 않고, 저명한 저서들에서도 STL이라는 용어를 사용해, STL을 그대로 사용하는 것도 문제가 없을 수도 있다. 개인적으로도 크게 문제가 될 것이 없다고 생각한다. 다만, 정확한 표현은 표준 문서의 내용대로 STL을 빼고 C++ 표준 라이브러리라고 하는 것이 맞다.
결국 이름에 관한 논쟁의 결론은 다음과 같다. STL이라고 불러도 상관없지만, 정확한 표현은 C++ 표준 라이브러리라고만 부르는 것이 맞다. 앞으로의 글에서도 이를 따라서 표준 라이브러리나 줄여서 std라는 용어를 사용하고자 한다.
참고자료
Standard Template Library (wikipedia)
Generic Programming (wikipeida)
Short History of STL