Programming/C, C++

[C++] 컨테이너(Container)와 이터레이터(Iterator) 기초 1

변화의 물결1 2025. 5. 22. 17:56

 

 

안녕하세요

 

 이번에는 C++의 개념 중에 컨테이너(Container)와 이터레이터(Iterator)의 기본 정의와 사용법에 대해 알아보겠습니다.

 


 

 

1. 컨테이너(Container)란?

 

 이전 내용에서 몇 번 언급했지만, 정의에 해대서 다시 알아보겠습니다.

 

 C++에서 컨테이너는 동일한 타입의 여러 객체(데이터)들을 담는 자료구조라고 생각하면 쉬울 것입니다. 마치 물건을 담는 상자처럼, 컨테이너는 숫자, 문자열, 또는 사용자가 만든 객체들을 보관하고 관리하는 역할을 합니다.

 

 C++ 표준 템플릿 라이브러리(Standard Template Library, STL)는 다양한 종류의 컨테이너를 제공합니다. 대표적으로는 다음과 같은 것들이 있습니다.

 

 std::vector : 동적으로 크기가 변하는 배열

 std::list : 양방향 연결 리스트

 std::map : 키(Key)와 값(Value)을 쌍으로 저장하는 연관 컨테이너 (트리 구조 기반)

 std::array : 고정된 크기의 배열

 

 이러한 컨테이너들은 데이터를 저장하는 방식과 성능 특성이 각기 다르기 때문에, 상황에 맞게 적절한 컨테이너를 선택하는 것이 중요합니다.

 

 

2. 이터레이터(Iterator)란?

 

이터레이터는 컨테이너 안에 저장된 요소들을 가리키고, 그 요소들에 접근할 수 있게 해주는 객체입니다. 마치 책갈피처럼 컨테이너 속의 특정 위치를 기억하고, 하나씩 넘겨가며 내용을 읽을 수 있게 도와주는 것이라고 생각하면 됩니다.

 

 중요한 점은, 이터레이터는 컨테이너의 종류에 상관없이 일관된 방식으로 요소에 접근할 수 있도록 해준다는 것입니다. 

 std::vector를 사용하든 std::list를 사용하든, 이터레이터를 사용하는 기본적인 문법은 거의 동일합니다.

 

조금 더 설명하면,

  - 이터레이터는 컨테이너 내의 특정 요소를 가리키는 포인터와 비슷한 역할을 합니다.

  - 각 컨테이너 클래스는 자신만의 이터레이터 타입을 내부에 정의하고 있습니다 (예: std::vector<int>::iterator).

  - 이터레이터를 사용하면 for문과 같은 반복문에서 컨테이너의 모든 요소를 순차적으로 방문(traverse)할 수 있습니다.

 

 

3. 왜 이터레이터를 사용할까?

 

 이터레이터의 가장 큰 장점은 추상화입니다. 컨테이너의 내부 구조를 직접 알 필요 없이, 이터레이터가 제공하는 통일된 인터페이스를 통해 요소에 접근할 수 있습니다.

 

 덕분에 컨테이너의 종류가 바뀌더라도, 요소를 순회하는 코드의 큰 틀은 변경하지 않아도 되는 경우가 많습니다. 이는 코드의 재사용성과 유지보수성을 높여줍니다.

 

 

4. 소스코드 std::vector와 iterator 사용법 확인

 

 위의 내용을 실제로 사용할 수 있는 코드로 확인해 보겠습니다.

 가장 많이 사용되는 컨테이너 중 하나인 std::vector와 iterator를 사용하는 간단한 예제입니다.

 

#include <iostream>
#include <vector>  

int main()
{
    // int 타입을 저장하는 std::vector 컨테이너 생성
    std::vector<int> v;

    // vector에 요소 추가 (뒤에서부터 차례로 삽입)
    v.push_back(4);
    v.push_back(7);
    v.push_back(9);
    v.push_back(1);
    v.push_back(3);

    // std::vector<int> 타입의 이터레이터 변수 선언
    std::vector<int>::iterator it;

    for (it = v.begin(); it != v.end(); it++)
    {
        // *it: 이터레이터가 가리키는 요소의 값을 가져옴
        const int iNumber = *it;
        printf("%d\n", iNumber);
    }

    return 0;
}

 

 

간략하게 코드를 설명한다면,

 

1) std::vector<int> v;

  정수(int) 타입의 요소들을 저장할 수 있는 std::vector 객체 v를 생성합니다.

  v가 바로 컨테이너가 됩니다.

 

2) v.push_back(값);

  push_back() 멤버 함수는 vector의 맨 뒤에 새로운 요소를 추가합니다.

 

3) std::vector<int>::iterator it;

  std::vector<int>에 대한 iterator이므로 std::vector<int>::iterator라는 타입을  가집니다.

 

4) for (it = v.begin(); it != v.end(); it++)

  v.begin(): vector의 첫 번째 요소를 가리키는 iterator를 반환합니다.

  v.end(): vector의 마지막 요소 바로 다음 위치를 가리키는 iterator를 반환합니다.

  it++: iterator를 증가시켜 다음 요소를 가리키도록 합니다.

 

5) const int iNumber = *it;

  *it (역참조 연산자)를 사용하여 이터레이터 it가 현재 가리키고 있는 요소의 실제 값을 가져옵니다.

 

 

<실행 결과>

  입력한 순서대로 출력도 동일하게 나오는 것을 확인할 수 있습니다.

 

 

 

 

감사합니다.

 

 

<참고 자료>

1. C++ Understanding: 고급 Advanced

https://www.youtube.com/playlist?list=PLrrTotxaO6khn83BjtBN-1HMDc9MZ__yt

2. Effective Modern 이펙티브 모던 C++, Book

 

반응형