Menu
Coddy logo textTech

STL 개요 및 철학

Coddy C++ 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 104개 중 70번째.

표준 템플릿 라이브러리(STL)는 일반적인 데이터 구조와 알고리즘을 제공하는 템플릿 기반 클래스 및 함수의 집합입니다. 여러분이 배운 템플릿 개념을 바탕으로 구축된 STL은 데이터 저장과 데이터 조작을 분리한다는 강력한 설계 철학을 구현합니다.

STL은 함께 작동하는 세 가지 핵심 구성 요소를 중심으로 구성됩니다:

구성 요소목적예시
컨테이너객체 컬렉션 저장vector, map, set
반복자컨테이너 요소에 대한 접근 제공입력, 출력, 임의 접근
알고리즘데이터에 대한 작업 수행sort, find, transform

핵심적인 통찰은 알고리즘이 컨테이너에 대해 직접적으로 알지 못한다는 것입니다. 알고리즘은 반복자(iterator)를 통해 작동합니다. 이는 단일 sort 알고리즘이 벡터, 배열 및 적절한 반복자 타입을 제공하는 모든 컨테이너와 함께 작동함을 의미합니다:

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> nums = {5, 2, 8, 1, 9};
    
    std::sort(nums.begin(), nums.end());
    
    for (int n : nums) {
        std::cout << n << " ";
    }
    // Output: 1 2 5 8 9
}

이러한 분리는 새로운 코드를 작성하지 않고도 호환되는 모든 컨테이너와 함께 모든 알고리즘을 조합하여 사용할 수 있음을 의미합니다. STL은 실전에서 검증되고 최적화된 구현을 제공하므로, 일반적인 데이터 구조를 직접 구현하는 대신 문제 해결에 집중할 수 있습니다.

challenge icon

챌린지

쉬움

컨테이너, 반복자(iterator), 알고리즘을 분리하는 STL의 철학을 보여주는 간단한 데이터 처리 시스템을 구축해 보겠습니다. STL 컴포넌트와 함께 작동하는 유틸리티 모듈과 이러한 조각들이 어떻게 결합되는지 보여주는 메인 프로그램을 만들 것입니다.

두 개의 파일을 생성하게 됩니다:

  • DataProcessor.h: 반복자를 통해 STL 컨테이너와 함께 작동하는 유틸리티 함수를 정의하여 STL의 설계 철학을 보여줍니다.

    std::vector<int>&를 인자로 받아 모든 요소를 공백으로 구분하여 출력하고 줄바꿈을 수행하는 printVector 함수를 만드세요. 컨테이너를 순회할 때는 반복자(begin()end())를 사용하세요.

    std::vector<int>&를 인자로 받아 std::sort를 사용하여 정렬한 다음, 정렬된 요소를 공백으로 구분하여 출력하고 줄바꿈을 수행하는 sortAndPrint 함수를 만드세요.

    std::vector<int>&와 검색할 int 값을 인자로 받는 findElement 함수를 만드세요. std::find를 사용하여 요소를 찾으세요. 요소를 찾으면 Found: <value>를 출력하고, 찾지 못하면 Not found: <value>를 출력하세요.

    std::vector<int>&를 인자로 받아 모든 요소의 합계를 반환하는 getSum 함수를 만드세요. 이를 위해 반복자를 사용한 간단한 루프를 사용할 수 있습니다.

  • main.cpp: 입력을 읽고 STL 컴포넌트가 어떻게 함께 작동하는지 보여줍니다.

    다섯 개의 입력을 읽습니다 (각각 별도의 줄에 입력됨):

    1. 첫 번째 정수
    2. 두 번째 정수
    3. 세 번째 정수
    4. 네 번째 정수
    5. 검색할 값

    std::vector<int>를 생성하고 처음 네 개의 정수를 추가합니다. 그런 다음 다음을 통해 STL 철학을 보여줍니다:

    1. Original: 을 출력한 후 printVector 호출
    2. Sorted: 를 출력한 후 sortAndPrint 호출
    3. 검색 값을 사용하여 findElement 호출
    4. getSum을 사용하여 Sum: <result> 출력

예를 들어, 입력값이 5, 2, 8, 1, 8인 경우:

Original: 5 2 8 1 
Sorted: 1 2 5 8 
Found: 8
Sum: 16

입력값이 10, 30, 20, 40, 15인 경우:

Original: 10 30 20 40 
Sorted: 10 20 30 40 
Not found: 15
Sum: 100

여러분이 만든 함수가 반복자를 통해 벡터와 어떻게 상호작용하는지, 그리고 std::sortstd::find가 적절한 반복자 타입을 제공하는 모든 컨테이너에서 어떻게 작동하는지 주목해 보세요. 이것이 바로 STL 설계의 힘입니다. 알고리즘은 컨테이너와 분리되어 있으며, 오직 반복자를 통해서만 연결됩니다.

치트 시트

표준 템플릿 라이브러리(STL)는 공통 데이터 구조와 알고리즘을 제공하는 템플릿 기반 클래스와 함수의 집합입니다. 이는 데이터 저장과 데이터 조작을 분리합니다.

STL에는 세 가지 핵심 구성 요소가 있습니다:

구성 요소목적예시
컨테이너(Containers)객체 컬렉션을 저장합니다.vector, map, set
반복자(Iterators)컨테이너 요소에 대한 접근을 제공합니다.입력, 출력, 임의 접근
알고리즘(Algorithms)데이터에 대한 연산을 수행합니다.sort, find, transform

알고리즘은 컨테이너와 직접 작동하지 않고 반복자를 통해 작동합니다. 이를 통해 하나의 알고리즘이 호환되는 모든 컨테이너와 함께 작동할 수 있습니다:

#include <vector>
#include <algorithm>
#include <iostream>

int main() {
    std::vector<int> nums = {5, 2, 8, 1, 9};
    
    // 반복자를 사용하여 정렬
    std::sort(nums.begin(), nums.end());
    
    // 반복자를 사용하여 순회
    for (int n : nums) {
        std::cout << n << " ";
    }
    // 출력: 1 2 5 8 9
}

일반적인 반복자 메서드:

  • begin() - 첫 번째 요소를 가리키는 반복자를 반환합니다.
  • end() - 마지막 요소 다음 위치를 가리키는 반복자를 반환합니다.

일반적인 STL 알고리즘:

  • std::sort(begin, end) - 범위 내의 요소를 정렬합니다.
  • std::find(begin, end, value) - 범위 내에서 값을 검색합니다.

직접 해보기

#include <iostream>
#include <vector>
#include "DataProcessor.h"

using namespace std;

int main() {
    // 입력으로부터 다섯 개의 정수를 읽습니다
    int num1, num2, num3, num4, searchValue;
    cin >> num1;
    cin >> num2;
    cin >> num3;
    cin >> num4;
    cin >> searchValue;
    
    // TODO: vector를 생성하고 처음 네 개의 정수를 여기에 추가합니다
    
    // TODO: "Original: "을 출력하고 printVector를 호출합니다
    
    // TODO: "Sorted: "를 출력하고 sortAndPrint를 호출합니다
    
    // TODO: searchValue와 함께 findElement를 호출합니다
    
    // TODO: "Sum: "을 출력한 뒤 getSum의 결과를 출력합니다
    
    return 0;
}
quiz icon실력 점검

이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.

객체 지향 프로그래밍의 모든 레슨