더북(TheBook)

1.4 | 반복자

 

반복자는 포인터와 비슷하게 동작하는 클래스 템플릿 타입의 객체를 말한다. 반복자 iter가 유효 객체를 가리킨다면 *iter라고 쓰기만 해도 반복자 iter를 역참조해서 객체에 대한 참조를 얻을 수 있다. iter가 클래스 객체를 가리킨다면 객체의 멤버 memberiter->member로 접근할 수 있다. 따라서 반복자는 포인터처럼 쓰면 된다.

반복자를 사용하면 컨테이너에 있는 원소들에 접근하면서 일정한 방식으로 원소들을 처리할 수 있는데, 특히 STL 알고리즘을 이렇게 처리한다. 그러니까 반복자는 컨테이너의 종류와 상관없이 컨테이너에 있는 원소들과 알고리즘을 이어준다. 반복자는 데이터에서 알고리즘을 분리해준다. 다시 말해 알고리즘은 컨테이너 내부에 데이터가 어떤 방식으로 구성되어 있는지 전혀 몰라도 된다. 반복자는 iterator 헤더에 정의된 템플릿 타입의 인스턴스지만, 컨테이너에 대해서도 알아야 하므로 컨테이너를 정의한 헤더들이 모두 포함되어 있다.

반복자는 원소들의 범위를 정의하므로 한 쌍으로 사용하는 게 보통이다. 원소들은 컨테이너에 있는 객체들일 수도 있고, 표준 배열의 원소들일 수도 있고, string 객체의 문자들일 수도 있고, 아니면 반복자를 지원하는 객체 타입의 원소들일 수도 있다. 범위의 첫 번째 원소를 가리키는 begin 반복자와 마지막 원소를 가리키는 end 반복자로 지정한 원소들의 순차열로 범위를 표현한다. 순차열이 컨테이너 원소들의 부분일 때도 end 반복자는 순차열에서 마지막 원소가 아니라 마지막 원소에서 하나 더 지나친 위치를 가리킨다. 컨테이너에 있는 원소들 전체를 표현할 때 end 반복자는 어떤 원소도 가리키지 않으므로 역참조될 수 없다. STL에서 반복자는 원소들의 범위를 다루는 표준 방법이다. 원소들의 범위 지정과 원소들을 어떻게 조직화하는지가 분리되어 있으므로 반복자가 알고리즘의 사용 조건만 만족한다면 어떤 소스라도 원소들의 범위에 알고리즘을 적용할 수 있다. 반복자의 종류에 대해서는 나중에 자세히 설명하겠다.

일단 반복자가 어떻게 동작하는지 이해하면 반복자로 지정된 데이터 순차열을 인수로 받아서 처리하는 템플릿 함수를 직접 정의하는 것도 어렵지 않다. 직접 정의한 함수 템플릿의 인스턴스는 범위로 정의할 수만 있다면 어떤 데이터에도 적용할 수 있다. 즉, 이 코드는 배열의 데이터에도 동작하고, 벡터 컨테이너의 데이터에도 동작할 것이다. 실제로 동작하는 예제는 뒤에서 살펴보겠다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.