Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

STL과 C++ 표준 라이브러리의 차이점 완벽 정리

표준 템플릿 라이브러리(STL, Standard Template Library)는 C++ 프로그래밍 언어를 위한 소프트웨어 라이브러리로, C++ 표준 라이브러리의 많은 부분에 지대한 영향을 미쳤습니다. STL은 알고리즘, 컨테이너, 함수 객체, 반복자라는 네 가지 핵심 구성 요소를 제공합니다.

흥미로운 점은 "STL" 또는 "Standard Template Library"라는 용어가 ISO 14882 C++ 표준 문서 어디에도 공식적으로 등장하지 않는다는 사실입니다. 따라서 C++ 표준 라이브러리를 흔히 STL이라고 부르는 것은 엄밀히 말해 정확하지 않습니다. STL과 C++ 표준 라이브러리는 서로 다른 개념이며, STL은 C++ 표준 라이브러리의 일부(하위 집합)에 해당한다고 이해하는 것이 올바릅니다.

STL의 구성 요소

1. 컨테이너(Container)

컨테이너는 데이터를 저장하는 객체로, 시퀀스 컨테이너와 연관 컨테이너로 나뉩니다. 대표적인 시퀀스 컨테이너에는 vector, deque, list가 있으며, 연관 컨테이너에는 set, multiset, map, multimap, hash_set, hash_map, hash_multiset, hash_multimap이 포함됩니다.

이 외에도 queue, priority_queue, stack과 같은 컨테이너 어댑터(container adaptor)가 있습니다. 컨테이너 어댑터는 다른 컨테이너를 내부 구현으로 사용하면서 특정 인터페이스만 노출하는 컨테이너입니다.

2. 반복자(Iterator)

반복자는 프로그래머가 컨테이너의 요소를 순회할 수 있도록 해주는 객체입니다. STL은 다섯 가지 유형의 반복자를 구현합니다.

  • 입력 반복자(Input): 값의 시퀀스를 읽는 데 사용
  • 출력 반복자(Output): 값의 시퀀스를 쓰는 데 사용
  • 순방향 반복자(Forward): 읽기와 쓰기가 모두 가능하며 앞으로만 이동
  • 양방향 반복자(Bidirectional): 순방향 반복자와 같지만 뒤로도 이동 가능
  • 임의 접근 반복자(Random Access): 한 번의 연산으로 임의의 거리만큼 자유롭게 이동

반복자는 STL이 다양한 컨테이너에 대해 범용적으로 동작할 수 있게 만드는 핵심 기능입니다.

3. 알고리즘(Algorithm)

STL의 알고리즘은 요소들의 범위(range)에 사용하도록 특별히 설계된 함수들의 집합입니다. 여기서 범위란 반복자나 포인터를 통해 접근할 수 있는 객체의 시퀀스, 예를 들어 배열이나 STL 컨테이너의 인스턴스를 의미합니다.

대표적인 STL 알고리즘의 예는 다음과 같습니다.

  • sort: 범위 내 요소 정렬
  • binary_search: 정렬된 시퀀스에서 특정 값의 존재 여부 검사
  • min_element: 범위 내 가장 작은 요소 반환

주목할 점은 이러한 알고리즘들이 템플릿으로 작성되어 있어, 템플릿 인자로 받아들일 수 있는 모든 데이터 타입에 적용할 수 있다는 것입니다.

C++ 표준 라이브러리란?

C++ 프로그래밍 언어에서 C++ 표준 라이브러리는 코어 언어로 작성되었으며 C++ ISO 표준 그 자체의 일부인 클래스와 함수들의 집합입니다. C++ 표준 라이브러리는 여러 범용 컨테이너, 이를 활용하고 조작하기 위한 함수들, 함수 객체, 범용 문자열과 스트림(대화형 I/O 및 파일 I/O 포함), 일부 언어 기능에 대한 지원, 그리고 숫자의 제곱근 계산과 같은 일상적인 작업을 위한 함수들을 제공합니다.

C++ 표준 라이브러리의 주요 구성 요소는 다음과 같습니다.

스트림(Streams)

다양한 종류의 스트림을 다루는 라이브러리입니다. 예를 들어 파일 스트림 클래스는 파일 생성, 파일에 정보 쓰기, 파일에서 정보 읽기에 사용되며, 문자열 스트림(stringstream)은 문자열 조작에 주로 활용됩니다.

컨테이너(Containers)

vector, set, map, stack, queue 등 다양한 자료구조 형태로 데이터를 저장하는 데 사용되는 클래스들의 집합입니다. 이 부분은 STL의 구성 요소이기도 합니다.

일반 유틸리티 라이브러리

<algorithm>, 시간 처리를 위한 <chrono>, <iterator>, <memory> 등 폭넓게 사용되는 라이브러리들이 여기에 속합니다.

수치 라이브러리(Numerics Library)

C++ 프로그램이 준수치(semi-numerical) 연산을 수행하는 데 사용할 수 있는 구성 요소들의 집합입니다. 예를 들어 <complex>는 복소수를 표현하고 조작하기 위한 클래스 템플릿과 여러 함수를 정의하며, <random>은 (유사)난수 생성에 사용됩니다.

스레딩(Threading)

C++11에서 도입된 라이브러리로, 동시성(concurrency) 처리를 담당합니다. 스레드 생성과 관리, 뮤텍스, 조건 변수 등 멀티스레드 프로그래밍에 필요한 기능을 제공합니다.

C 표준 라이브러리(C Standard Library)

C 표준 라이브러리의 각 헤더는 확장자 .h를 제거하고 접두사 'c'를 붙인 이름으로 C++ 표준 라이브러리에 포함됩니다. 예를 들어 'time.h'는 'ctime'이 됩니다.

정리: STL vs C++ 표준 라이브러리

결론적으로 STL은 알고리즘, 컨테이너, 함수 객체, 반복자 중심의 라이브러리이며, C++ 표준 라이브러리는 여기에 스트림, 수치 연산, 스레딩, C 호환 헤더 등 훨씬 더 광범위한 기능까지 포괄하는 상위 개념입니다. 두 용어를 혼동하지 말고, STL이 C++ 표준 라이브러리에 포함된 핵심 구성 요소라는 점을 기억해 두면 좋습니다.