C++ 프로그래밍/클래스

윈도우에서 제공하는 표준 템플릿 라이브러리 라이브러리(STL)

같은편 2022. 9. 3. 22:36

C++ 표준 템플릿 라이브러리(STL)
템플릿은 일반화된 코드의 형태로 다양한 타입에 대한 처리를 가능하게 합니다.
따라서 라이브러리가 템플릿 형태로 제공된다면 많은 장점이 생기게 됩니다.
C++에서는 표준 템플릿 라이브러리(STL)를 제공합니다.
프로그램에서 공통적으로 많이 사용하는 다양한 자료구조(vector, list, deque 등등)와
알고리즘(정렬, 탐색, 힙 등등)들을 템플릿의 형태로 제공합니다.

STL에 대해 배우기 전에 가장 많이 사용되는 컨테이너 중 하나인 벡터를 구현해 보고 활용해 보면서 이해하는 과정을 거쳐야 합니다.
STL.. 저는 이해하기 많이 어려웠습니다..

하지만 제가 이해한 부분을 최대한 적어보겠습니다.

STL(Standard Template Library)의 구성

위의 이미지는 제가 이해한 내용으로 STL은 컨테이너와 알고리즘 그리고 반복자로 구성됩니다.

 

  • 컨테이너: 자료를 저장하는 창고로 벡터, 리스트, 스택, 큐, 집합, 맵 등 다양한 자료구조를 제공합니다.
  • 알고리즘: 탐색이나 정렬과 같은 다양한 알고리즘을 제공합니다.
  • 반복자: 컨테이너에 저장된 자료들을 순차적으로 처리하기 위한 것으로,
    컨테이너와 알고리즘을 연결하는 역할을 합니다.

저는 이 게시물에는 제가 가장 이해하기 난해했던 반복자에 대한 설명만을 하도록 하겠습니다.

STL에 대한 더 자세한 설명은 게임으로 배우는 C++ 책에 그림과 함께 있기 때문에 이해하기 어려운 반복자만을 한번 설명하려고 합니다.

컨테이너에 나오는 벡터나 리스트는 자료구조, 알고리즘에 나오는 정렬이나 탐색은 알고리즘 수업이나 책을 보시는 것을 추천드립니다. 

반복자란?

STL에서는 알고리즘들을 컨테이너의 멤버 함수로 제공하지 않았습니다.

예를 들어 벡터 템플릿에 정렬이나 탐색과 같은 알고리즘을 구현한 멤버 함수가 아예 없습니다.

만약 알고리즘들을 컨테이너의 멤버 함수로 제공한다면 많은 컨테이너에도 넣어야 되고

이 경우 라이브러리가 방대해지고 확장성도 좋지 않습니다.

 

(저는 이 STL의 반복자 개념을 보고 예전에 제가 배웠던 프로그래밍 문제 해결 방법중에 기본 개념 중 하나가 생각이 들었습니다.

바로 "큰 문제를 작은 걸로 쪼개는 것"

프로그래밍 공부를 하면 할 수록 배웠던 개념과 그런 것들이 다른 방식으로 계속 나오는게 참 신기합니다.

저도 아직 많이 부족하지만 아는게 많은 만큼 하나를 볼 때도 여러 생각이 들고 이래서 공부를 멈추면 안되겠다는 생각이 듭니다.)

 

다시 본론으로 돌아와서 위의 이유로 STL에서는 이들을 분리하는 방법을 고안했습니다.

알고리즘은 컨테이너와 분리하여 템플릿 함수로 제공하고, 다양한 컨테이너가 같은 템플릿 함수를 공유하도록 설계하였습니다.

그리고 컨테이너와 알고리즘을 연결하기 위해 반복자를 사용하였습니다.

 

결론은 STL은 서로 다른 컨테이너가 알고리즘을 구현한 템플릿 함수를 사용하도록 하였습니다.

 

하지만, 문제는 컨테이너마다 항목의 접근 방법이 다르다는 것입니다.

for (int i = 0; i < vector.size(); i++)
{
	cout << vector[i] << " ";
}

위의 방법은 벡터의 항목 접근 방법이고 배열과 같이 인덱스를 통해 함공의 위치를 바로 계산해서 접근할 수 있습니다.

for (Node* p = list.heat(); p != NULL; p = p->link)
{
	cout << p->data << " ";
}

위의 방법은 리스트의 항목 접근 방법이고 각 항목에 저장된 다음 주소를 통해 접근합니다.

 

이렇게 컨테이너마다 자료의 접근 방법(벡터에서는 인덱스, 리스트에서는 노드의 포인터)이 다릅니다.

그렇기에 동일한 알고리즘을 하나의 함수로 구현해 사용하기가 어렵습니다.

따라서 자료의 위치를 나타내는 일반적인 방법, 일반화된 포인터가 필요합니다. 이것이 바로 반복자입니다.

 

정리하자면

  1. 반복자는 일반화된 포인터로 컨테이너의 멤버를 가리키는 객체입니다.
  2. 컨테이너의 종류와 상관없이 일관된 방법으로 컨테이너의 요소에 접근할 수 있는 방법을 제공합니다.
  3. 모든 컨테이너는 특별한 위치의 반복자를 반환하는 함수를 지원합니다.