39-1.반복자

39-1-가.반복자의 정의

앞 장에서 간단히 소개했다시피 반복자는 컨테이너의 한 지점을 가리키는 객체이다. 배열의 첨자나 연결 리스트의 노드 포인터도 이런 역할을 하지만 반복자는 기존의 포인터에 비해 훨씬 더 일반화된 개념이다. 컨테이너의 종류와 내부 구조에 상관없이 한 요소를 가리키는 목적으로 반복자라는 동일한 장치를 일관된 방법으로 사용할 수 있다.

컨테이너에 대해 어떤 작업을 하고 싶다면 먼저 이 컨테이너에 저장되어 있는 요소에 접근해야 하므로 순회가 꼭 필요하다. 알고리즘이란 컨테이너 자체에 대해 적용되는 것이 아니라 결국은 컨테이너의 요소들에 적용되는 것이므로 요소를 읽고 쓸 수 있어야 하는데 이를 위해 반복자가 사용된다. 알고리즘은 반복자를 통해 컨테이너의 요소를 읽고 변경하며 컨테이너는 알고리즘을 호출할 때 작업 대상 요소를 반복자로 지정한다. 그래서 반복자를 알고리즘과 컨테이너를 연결하는 매개체라고 한다.

반복자를 관리하는 기본적인 방법은 ++, --, *, ==, >, < 등의 연산자이며 이 연산자들은 모든 반복자에 대해 동일한 의미를 가진다. 이처럼 반복자를 사용하는 방법이 일반화되어 있기 때문에 컨테이너의 내부 구조에 상관없이 동일한 방법으로 읽기, 이동, 대입, 비교 가능하다. 알고리즘의 내부 코드는 컨테이너에 대해서는 전혀 모르며 컨테이너를 직접 다루지도 않고 오로지 반복자를 통해서만 컨테이너의 요소에 접근한다.

그래서 동일한 코드로 작성되어 있는 알고리즘을 여러 개의 컨테이너에 똑같이 적용할 수 있다. 예를 들어 find는 지정한 구간을 순서대로 순회하며 값을 검색하는데 벡터나 리스트의 내부 구조가 완전히 다르지만 반복자가 * 연산자와 ++ 연산자, 비교 연산자 등만 잘 정의한다면 두 컨테이너를 동일한 방법으로 검색할 수 있는 것이다. 요소들이 어떤 모양을 가지든지 * 연산자로 읽을 수 있고 요소들간의 배치 관계에 상관없이 ++만 하면 다음 요소로 이동 가능하다.

STL 알고리즘의 원형을 보면 컨테이너에 대한 정보는 전혀 전달되지 않으며 반복자에 대한 정보만 전달된다. find 뿐만 아니라 copy, replace, merge 등의 알고리즘도 마찬가지이다. 알고리즘은 자신이 누구를 조작하는지는 몰라도 반복자를 통해 어떻게 조작할 것인가는 분명히 알고 있다. 반복자는 임의의 컨테이너와 임의의 알고리즘을 연결하여 STL의 일반성을 확보하는 가장 중요한 장치이다.

영어 원문으로는 이터레이터(iterator)라고 하는데 한글로 그대로 쓰면 너무 길어져 흔히 반복자로 번역하며 이 책도 우세한 번역을 따르고 있다. 비슷한 작업을 계속 반복하는 용도보다는 컨테이너를 순회하거나 요소를 가리키는 것이 더 주된 기능이므로 순회자나 지시자로 번역하는 것도 무난한 것 같다. 아무튼 원문이나 타입 정의에 이 단어가 자주 사용되므로 반복자의 원어가 iterator라는 것은 꼭 알아 두어야 한다.