[TIL_C++] 템플릿과 STL

zehova
|2025. 8. 28. 20:11

🎮 오늘의 기술 키워드

C++ 템플릿 (Templates)

 

템플릿은 C++의 메타프로그래밍 기법 중 하나로, 타입에 구애받지 않는 범용적인 함수나 클래스를 작성할 수 있게 해준다. 즉, 하나의 소스 코드로 여러 데이터 타입을 처리할 수 있는 일반화 프로그래밍을 가능하게 한다. 템플릿은 런타임이 아닌 컴파일 타임에 컴파일러가 특정 타입에 맞게 코드를 인스턴스화(Instantiation)하여 실제 실행 가능한 코드를 생성한다.

 

예를 들어, template <typename T> 구문을 사용하면 T가 int일 때의 함수와 string일 때의 함수가 각각 별도의 코드로 생성된다.

 

C++ STL (Standard Template Library)

 

STL은 C++ 표준에 포함된 강력한 라이브러리로, 대부분 템플릿으로 구현되어 있다. STL은 다음의 주요 구성 요소로 나뉜다.

  • 컨테이너 (Containers): 데이터를 저장하는 자료구조. vector (동적 배열), list (연결 리스트), map (연관 배열) 등이 대표.
  • 알고리즘 (Algorithms): 데이터를 처리하는 함수들의 모음. sort(), find(), transform() 등이 있으며, 컨테이너의 특정 타입에 종속되지 않고 작동.
  • 반복자 (Iterators): 컨테이너 내부의 원소를 순회하고 접근하는 데 사용되는 객체. 반복자는 컨테이너와 알고리즘을 연결하는 다리 역할을 하며, 알고리즘이 컨테이너의 내부 구현에 관계없이 데이터를 다룰 수 있도록 해주는 핵심 요소이다.

🌍 나만의 연결 (내 관심사와 엮기-내 관심사: 기획, 영화)

  • 기획: 템플릿은 영화 제작 기획서와 같다. 이 기획서에는 배우의 성별, 나이, 국적과 같은 구체적인 정보 대신, "주인공(Type T)은 역경을 헤쳐나간다"와 같은 추상적인 역할과 플롯이 담겨 있다. 이 기획서는 어떤 배우(int, string 등)가 캐스팅되더라도 동일한 이야기를 풀어나갈 수 있는 유연한 설계를 제공한다.

 

  • 영화: STL의 구성 요소들은 영화 제작팀의 역할을 분담합니다.
    • 컨테이너촬영 세트장에 비유할 수 있다. vector는 물건들이 일렬로 정돈된 창고, map은 물건에 이름표가 붙어있는 소품실이라고 할 수 있다.
    • 알고리즘은 세트장 안의 물건들을 옮기거나, 재배치하거나, 찾는 역할을 하는 촬영 스태프.
    • 가장 중요한 반복자는 세트장 안에서 스태프가 물건의 정확한 위치를 알려주는 포인터와 같다. 감독(알고리즘)은 "A 구역의 저 소품을 가져와"라고 지시할 뿐, "A 구역은 벽에서 몇 미터 떨어져 있고, 소품은 바닥에서 몇 미터 위에 있으니..."와 같은 복잡한 내부 정보를 알 필요가 없다. 반복자가 모든 컨테이너에 대해 일관된 인터페이스를 제공하기 때문.

🧠 깨달음 & 질문

  • 깨달음: STL의 진정한 힘은 컨테이너, 알고리즘, 반복자가 완벽하게 분리된 구조를 이루고 있다는 점에 있다. 이 설계 덕분에 개발자는 vector에 사용하던 sort() 알고리즘을 list나 다른 컨테이너에도 그대로 적용할 수 있다. 이는 개발자가 매번 새로운 자료구조에 맞는 알고리즘을 다시 작성할 필요가 없다는 것을 의미하며, 코드의 재사용성생산성을 혁신적으로 높여준다.
  • 질문: vector와 list는 모두 sort() 알고리즘을 사용할 수 있지만, 내부적으로는 vector의 반복자가 무작위 접근(random access)을 지원하는 반면, list는 양방향 접근(bidirectional)만 지원한다. 이 반복자의 차이가 각 컨테이너에서 sort() 알고리즘의 성능에 어떤 영향을 미치는지 더 깊이 이해하고 싶다.

🧵 연결 태그

#C++ #템플릿 #STL #제네릭프로그래밍 #알고리즘 #컨테이너 #반복자


📌 오늘의 메모 한 줄

템플릿은 코드를 일반화하고, STL은 그 일반화된 코드로 구성된 강력한 도구 모음이며, 반복자는 이 도구들이 모든 컨테이너에서 작동하도록 돕는 인터페이스다.


🌱 내일을 위한 메모

std::vector<int>와 std::list<int>를 각각 선언하고, std::sort와 list의 멤버 함수 sort()를 사용하여 직접 성능 차이를 확인해보기.

반복자의 중요성을 체감 및 각 컨테이너의 장단점 이해.