안녕하세요
이번에는 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
'Programming > C, C++' 카테고리의 다른 글
[C++]컨테이너(Container)와 이터레이터(Iterator) 기초 2 (2) | 2025.05.23 |
---|---|
[C++] 타입 캐스팅 (static_cast, dynamic_cast) 대하여 (0) | 2025.05.10 |
[C++] 함수 템플릿 기초와 Name Mangling (Name Decoration) 대해 알아보기 (0) | 2025.05.03 |
[C++] 연산자 오버로딩(Operator Overloading)에 대해 좀 더 알아보기 (0) | 2025.04.29 |
[C++] using 정의와 추가적인 기능 알아보기 (0) | 2025.04.25 |