TIL

[C++ ] 템플릿(Template)과 STL 컨테이너정리

think95592 2026. 5. 8. 20:38

나중에 제가 다시 보려고 정리하는 핵심 요약집입니다.


1. 템플릿(Template): 만능 설계도

템플릿은 데이터 타입만 비워둔 '미완성 설계도'입니다.

  • 왜 쓰는가?: int형 인벤토리, string형 인벤토리를 일일이 만들지 않고, 하나만 만들어서 돌려쓰기 위함입니다.
  • 특징: T는 관습적인 이름일 뿐, ItemType처럼 자유롭게 지을 수 있으며 ,를 이용해 여러 개(T, U)를 쓸 수도 있습니다.
C++
 
template <typename T>
class Box {
    T data; // T는 나중에 int가 될 수도, string이 될 수도 있음!
};

2. STL(Standard Template Library): 데이터 바구니

C++이 기본으로 제공하는 템플릿 보관함들입니다.

종류 특징 주 사용처
Vector 동적 배열. 뒤에서 넣고 빼는 게 빠름 순서가 중요한 아이템 리스트
Map Key-Value 쌍. 검색이 매우 빠름 아이템 이름으로 가격 찾기 (사전)
Algorithm sort, find 등 템플릿 함수 모음 데이터 정렬 및 탐색

3. 포인터 템플릿(T*)과 메모리 관리

가장 헷갈렸던 부분입니다. T*는 "정해지지 않은 타입의 주소값을 담는 구멍"입니다.

  • 화살표 연산자(->): 포인터로 객체 멤버에 접근할 때는 .이 아니라 ->를 쓴다!
  • new & delete: 힙 메모리에 동적으로 객체를 만들었다면(new), 반드시 소멸자에서 메모리를 해제(delete)해야 누수가 없다.

4. [실전 예제] 템플릿 기반 로그 관리 시스템

오늘 직접 코딩하며 배운 로그 매니저 시스템의 최종 형태입니다.

C++
 
#include <iostream>
#include <vector>
#include <string>

using namespace std;

// 1. 로그 하나를 담는 템플릿 클래스
template <typename T>
class LogEntry {
private:
    T data;
    string category;
public:
    LogEntry(string cat, T d) : category(cat), data(d) {}
    void Print() {
        cout << "[" << category << "] " << data << endl;
    }
};

// 2. 로그들을 관리하는 매니저 클래스
class LogManager {
private:
    vector<LogEntry<string>*> stringLogs; // 문자열 로그 포인터 보관
    vector<LogEntry<int>*> scoreLogs;     // 점수 로그 포인터 보관

public:
    // 소멸자: new로 생성한 객체들 전부 delete (중요!)
    ~LogManager() {
        for (auto log : stringLogs) delete log;
        for (auto log : scoreLogs) delete log;
        cout << "메모리 정리 완료!" << endl;
    }

    void AddStringLog(string cat, string msg) {
        stringLogs.push_back(new LogEntry<string>(cat, msg));
    }

    void ShowAll() {
        for (auto log : stringLogs) log->Print();
    }
};

💡 오늘의 깨달음 (복습 포인트)

  1. 생성자는 객체 생성 시 꼭 필요한 정보(카테고리, 데이터 등)를 한 번에 받아서 초기화하는 게 안전하다.
  2. 부모 클래스의 소멸자에는 반드시 virtual을 붙이자. 그래야 자식 객체까지 깨끗하게 지워진다.
  3. 포인터 벡터를 썼다면, 벡터가 사라지기 전에 알맹이(new로 만든 것)부터 먼저 delete 해야 한다.
  4. c++11부터 문자열을 인트로 바꿀 때 stoi()로 가능
std::string str = "12345";
int num1 = std::stoi(str);