관리 메뉴

Kim's Programming

STL(Standard Template Library) 본문

STL - Container

STL(Standard Template Library)

Programmer. 2015. 12. 20. 00:07

일반화 프로그래밍


프로그램은 자료구조 포스팅 제일 앞에서 처럼 자료 구조와 알고리즘으로 구성 됩니다. 자료 구조란 처리하고자 하는 데이터를 표현 하는 방법이고, 알고리즘은 이 자료들을 가공하여 유용한 정보를 생산하는 기법입니다. 좋은 프로그램에서는 두가지가 모두 필요하며 한쪽이라도 부족하면 전체적인 질이 떨어지게 됩니다. 어떤 자료구조를 사용할 것인가는 프로그램의 특수한 상황에 따라 달라집니다. 대용량의 자료를 빠른 속도로 읽어야 한다면 배열을 이용하는 것이 적합하며 삽입, 삭제가 빈번하다면 연결 리스트가 유리합니다. 또한 자료관리하는 방법이 일정하다면 스택이나 큐같이 입출력 순서가 미리 정해져 있는 자료구조를 사용해야합니다. 각 자료 구조마다 고유한 특징과 장단점이 있기 때문에 모든 형태의 데이터에 다 어울리는 자료구조는 없기 때문에 상황에 맞게 선택해야합니다.


자료구조를 조작하는 알고리즘은 많습니다. 삽입, 삭제, 추가, 검색, 정렬, 뒤집기, 병합, 추출, 누적 합계 등의 일반적인 알고리즘외에도 각 자료 구조에만 사용할 수 있는 독특한 알고리즘들이 존재 합니다. 데이터가 조직화되는 내부 구조와 관리 방법이 자료구조마다 다르기 때문에 매 자료 구조마다 알고리즘의 구현도 다릅니다.


자료구조나 알고리즘을 수정 없이 재사용하면 좋은데 이 시도중 하나가 객체 지향 프로그래밍 방법입니다. 그 다음으로 또 다른 방법인 STL은 일반화 프로그래밍 기법이라는 좀 더 발전된 개념의 재 사용성을 제공합니다. 일반화(Generic)는 객체 지향의 다음 세대라고 일컬어지는데  두가지 측면에서 일반성을 제공하게 됩니다.


    • 임의 타입에 사용할 수 있는 자료 구조를 만들 수 있다. 정수, 실수 등의 기본타입 부터 사용자 정의형 타입과 그 유도형 까지 관리할 수 있는 자료구조를 정의할 수 있습니다. 자료 구조의 일반성을 구현하기 위해 인수로 전달된 타입으로 클래스를 정의하는 C++의 Template 문법이 사용됩니다.

    • 자료구조의 형태나 내부 구조에 상관없이 임의의 데이터 집합에 적용할 수 있는 일반화된 알고리즘을 제공합니다. 자료 구조에 상관없이 사용 방법이 동일하므로 어떠한 형태의 데이터에 대해서도 적용할 수 있습니다. 논리적으로 비슷한 작업은 같은 방법으로 수행할 수 있으며 이를 위해 반복자라는 일반화된 포인터를 사용합니다.



이런 일반화의 개념에 의해 자주 사용되는 자료 구조와 알고리즘을 제공하는 라이브러리가 바로 STL입니다. 개발자는 자료 구조를 일일이 구현할 필요없이 STL이 제공하는 자료 구조를 선택해서 사용할 수 있으며 하나의 알고리즘을 임의의 자료 구조에 대해 일관되게 사용할 수 있습니다. 최소한의 의사표현만으로 모든 처리가 자동으로 수행됩니다.


STL은 Standard Template Library의 약자입니다. 일단은 라이브러리이되 템플릿의 집합을 제공하는 라이브러리이며 현재는 C++의 표준으로 채택되었습니다. C언어가 printf, 등 함수 수준의 라이브러리를 제공하지만 C++은 템플릿 수준의 더 범용적인 라이브러리를 제공합니다.


STL의 특징

일반화는 다른 기법들과 뚜렷이 구분되는 여러 가지 특징들을 가지고 있습니다. 이 특징, 그리고 장단점을 알아 보겠습니다.



    • 가장 큰 특징은 이름이 의미하듯이 일반화를 지원한다는 점입니다. 하나의 단일 알고리즘으로 복수개의 컨테이너에 동일한 작업을 똑같은 방법으로 수행할 수 있습니다.

    • 컴파일 타임 매커니즘을 사용하기 떄문에 실행시의 효율 저하가 거의 없습니다. STL을 쓰지 않았을 때의 코드에 비해 현격한 속도 차이가 없으며 오떤 경우에는 더 빠르기도 합니다. 그러나 고수준 라이브러리의 특성상 제대로 쓸 때만 이상적인 효율이 발휘된다는 제약도 존재합니다.

    • 객체 지향적이지 않습니다. 객체를 사용하기는 하지만 STL자체가 객체를 반드시 요구하는 것은 아닙니다. 알고리즘 함수들은 대부분 전역함수이며 멤버 함수로 제공되는 경우는 상대적으로 드뭅니다. 상속의 개념도 많이 사용하지 않으며 동적결합하는 가상함수는 느리다는 이유로 사용하지 않습니다. 모든 선택은 컴파일 중에 정적으로 결정됩니다.

    • 표준이므로 이식성이 당연히 확보됩니다. STL로 작성한 코드는 표준을 준수하는 어떠한 컴파일러로도 문제없이 컴파일할 수 있습니다.

    • 확장이 가능합니다. 소스가 공개되어 있으므로 STL 라이브러리를 분석하여 원하는 컨터에너와 알고리즘을 직접 작성하여 사용할 수 있습니다.


다음은 단점 또는 STL의 대중화가 어려운 이유입니다.



    • 템플릿에 기반하기 때문에 타입마다 함수와 클래스가 매번 구체화되어 코드가 비대해지는 고질적인 문제가 있습니다. 완전히 똑같은 컨테이너라도 타입이 바뀌면 두 벌의 거대한 코드 집합이 따로 생성됩니다. 풍부한 메모리 환경에서는 문제가 되지 않지만 낭비의 정도가 심한편입니다.

    • STL로 작성한 코드는 가독성이 심하게 떨어집니다. 템플릿 자체가 익숙치 않은 문법인데다가 템플릿 클래스의 타입명이 길어 얼른 의미를 파악하기 어렵습니다. 게다가 이중 삼중으로 템플릿이 중첩되면 만든 사람조차 거의 해석 불가능할 정도입니다. 소스의 가독성도 문제지만 에러 메세지도 의미를 해석하기 쉽지 않습니다. 소스가 난해하기 때문에 팀 프로젝트에 불리하며 디버깅도 어렵고 유지 보수 비용이 증가 하게됩니다.

    • 배우기에 결코 쉽지 않습니다.