STL(Standard Template, Library;표준 템플릿 라이브러리)은 일반적인 대학생들은 접할 일이 거의 없다. 대학의 C++ 강의에서는 가르칠 수 없는 환경일 수밖에 없는 것이, C를 첫 프로그래밍 언어로 배우면서 반복문에서, 포인터에서 멘탈이 터지면서 흥미를 날린 상태로 어거지로 C++을 배우기 때문이라고 생각한다.
대학에서 사용하는 C++ 교재에서는 기본적으로 템플릿과 STL을 부록 형식으로라도 다루기 때문에 충분히 정보를 제공하고 있지만, C++에서 OOP(Object-Oriented Programming;객체 지향 프로그래밍) 개념을 다루는 것에만 초점을 두고 강의를 진행하는 경우가 많기 때문에 쳐다볼 일도 거의 없다.
덕분에(?) 대부분의 대학생들은 템플릿과 더불어 STL이라는 용어 자체를 들어보지도 못하고 C++ 공부를 끝내버린다. 안타깝지만 그만한 이유가 없는 것은 아니다. STL에 있는 리스트, 스택, 큐의 개념은 이후 심화 과정인 자료구조론 등에서 별도로 가르치고 그에 대한 이해를 바탕으로 STL에 대한 내용을 정독하면 더욱 잘 활용해먹을 수 있기 때문이다. 이야기를 해봐야 입만 아프니 각설하고 본론으로 들어가보자.
STL은 템플릿으로 작성된 많은 제네릭 클래스와 함수 라이브러리로, 일반화 프로그래밍(generic programming)이라는 새로운 프로그래밍 패러다임을 가져오는데 일조했다. ISO/ANSI C++ 표준위에서 STL을 C++의 표준으로 채택해 지금은 이를 이용해서 제네릭 함수, 클래스를 사용할 수 있게 되었는데, STL에서 이들 함수와 클래스를 container, iterator, algorithm으로 분류한다.
Container;컨테이너
복잡한 설명은 생략하고 간단히 말해 우리가 흔히 배우는 자료 구조를 구현한 클래스로, 리스트, 큐, 맵, 셋, 벡터 등이 있으며 적절하게 활용하면 알고리즘 문제를 푸는데 있어 매우 유용하다.
컨테이너는 원소를 다루는 방식에 따라서 3가지로 분류한다.
순차 컨테이너(Sequence Container)
연속적인 메모리 공간에 순차적으로 값을 저장하고 읽는 컨테이너로 인덱스를 이용해 컨테이너 내 특정 위치에 접근하며 벡터(vector), 덱(dequeue), 리스트(list) 등이 이에 해당한다.
컨테이너 어댑터(Container Adaptors)
다른 컨테이너를 상속받아 기능 중 일부만 공개해 기능을 제한/변형한 컨테이너로 스택(stack), 큐(queue) 등이 이에 해당한다.
연관 컨테이너(Associative Container)
흔히 말하는 Key-Value를 사용하는 컨테이너로 조합(set), 맵(map)이 이에 해당한다.
Iterator;반복자
반복자라는 명칭 자체에 대해서 매우 추상적이고 지금껏 사용해오지 않은 명칭이라 헷갈려 하는 부분이 없지 않아 있다. 간단히 보자면 컨테이너의 원소들에 접근하기 위한 컨테이너 원소에 대한 포인터로, 종류에 따라서 읽고 쓰기 제한이 다르며 다양하게 활용할 수 있다.
Algorithm;알고리즘
알고리즘이라는 명칭 때문에 뭔가 심오한 것이라고 생각하겠지만, 컨테이너 원소들에 대해서 복사, 검색, 삭제, 정렬 등의 기능을 구현한 기본적인 템플릿 함수들을 통칭하는 명칭이며, 컨테이너 클래스의 멤버 함수가 아니다.
STL을 사용하기 위해서는 기본적으로 std 네임 스페이스(namespace;이름 공간)에 작성되어 있고, 적합한 헤더 파일을 추가해야 함을 알고 있어야 한다. 예를 들어 vector 클래스를 사용하고자 한다면 vector 헤더 파일을 추가하면 되고, 컨테이너 원소들을 적절히 처리하기 위한 함수들을 사용하고 싶으면 algorithm 헤더 파일을 추가해야 한다.
STL을 알고 있으면 알고리즘 문제를 푸는데 있어 매우 유용하다. 아무래도 리스트, 큐 등을 직접 구현하는 것보다 잘 최적화된 STL의 클래스들과 함수들을 이용하는 것이 더 편하고 완벽할 것이며, 문제의 본질에 집중할 수 있기 때문이다. 필자는, 아무것도 모르던 시절엔 STL을 모른다고 알고리즘 대회에 나가서 불리할 것 없다고 생각했던 시절이 있었으나, 지금은 생각이 많이 다르다. 표준 라이브러리이기 때문에 많은 대회에서 지원하는 환경(g++ 컴파일러)에서도 정상 작동하며, 구현에도 용이한데 안 쓰는 건 자체적으로 핸디캡을 쥐고 출전하는 것이나 마찬가지기 때문이다. 결론은, 장기적으로 볼 때, C++을 이용해 알고리즘 문제를 풀고 대회 출전을 고려하고 있다면 기초적인 STL 지식은 있어야 한다는 것이 필자의 개인적인 생각이다.
'Programming Language > C,C++' 카테고리의 다른 글
C++] 예외 및 예외 처리 기본 (0) | 2017.11.26 |
---|---|
C,C++] C++코드와 C 코드의 링크, Mangling 규칙 (0) | 2017.11.25 |
C++] 명품 C++ 프로그래밍 9장 실습문제 (3) | 2017.11.09 |
C++] 명품 C++ 프로그래밍 8장 실습문제 (0) | 2017.11.08 |
C++] 명품 C++ 프로그래밍 7장 실습문제 (0) | 2017.11.07 |