[Rust] 이터레이터(Iterator:반복자)

이터레이터는 순환을 표현할 때 사용하는 디자인패턴 중 하나로, 보통 컬렉션 같은 타입의 요소를 순서대로 접근할 때 사용한다.

러스트에서는 이터레이터를 트레잇-인터페이스로 정의해놓고 이를 구현토록 한다.
이터레이터엔 이런저런 유용한 메서드들이 꽤 많이 들어있다.

벡터를 통해 사용해보도록 하자.

일단 이터레이터는 into_iter()라는 메서드로 추출할 수 있다. 이건 또 IntoIterator라는 트레잇의 구현체다.
그리고 into_iter는 인자가 (self)이기 때문에 이동이 일어난다. 이터레이터를 뽑아내면 그 객체는 죽는다는 뜻이다.

자고로 백문불여일용(用)이라 하였다. image

image 이터레이터는 for-in의 반복 대상도 된다.


next
이터레이터에서 그 무엇보다 기본이 되는 메서드는 바로 next다. next는 단어 그대로 다음 요소로 위치를 이동시킨다.
그리고 해당 요소의 값을 Option으로 씌워서 반환한다. image

image


count
이터레이터가 가리키는 요소의 개수를 세서 반환한다. image

image 근데 이게 인자가 (self)라서 한번 쓰면 이터레이터가 이동돼서 죽어버린다.

간단하게 길이값만 빼오는게 아니라 한바퀴 순회를 하기 때문에 그런듯싶다.

복잡도도 O(N)일 것이다.


size_hint
참으로 기묘한 메서드다.
일단 인자는 (&self)라서 언제나 자유롭게 사용할 수 있다.

이건 이터레이터가 가리키는 요소의 개수가 대충 어느 범위에 있는지 알려준다. 현재 위치를 기준으로.
최소값과 최대값을 튜플로 묶어서 반환하는데, 최대값은 옵션으로 감싸서 반환한다. image

image 이건 되게 간단하고 직관적이라 정확하게 맞췄지만,
이렇게 꼬아놓으면 추측을 제대로 못한다. image

image 필터에 대해서는 이따 다루겠다.


last
마지막 요소를 옵션으로 감싸서 반환해주는 메서드다.
이것도 인자가 (self)라서 한번쓰면 죽는다.
마지막으로 곧장 이동하는게 아니라 순서대로 끝까지 가는거라, 특별히 속도가 빠르다거나 하진 않을 것이다. image

image


nth
인덱싱 기분내게 해주는 메서드다.
인자로 받은 수+1만큼 이동을 해서 요소값을 옵션으로 감싸 반환해준다. image

image


chain
두 이터레이터를 연결해준다.
쓸데가... 있나? image

image


map (★★★★★)
이제 좀 쓸만한 녀석이 나왔다.
함수형 언어들에서 항상 보이는 놈이다.

클로저를 통해서 각 요소값을 어떻게 매핑시킬지를 정의하고,
요소를 순회하면서 각 값을 매핑, 그걸 모아놓은 이터레이터를 만들어서 반환한다.

아래 코드에선 각 요소값에 2를 곱하도록 했다. image

image


filter (★★★★★)
이건 조건에 맞는 놈만 냅두고 걸러내는 녀석이다.
전달한 클로저에서 true가 반환되는 요소만 모아서 이터레이터를 생성, 반환한다.

아래 코드는 짝수만 걸러내도록 한 것이다. image

image


fold
요소들의 총합같은걸 구할때 쓴다.
첫번째 인자는 누적값의 초기값이다.
그리고 클로저의 첫번째 인자가 누적된 값, 두번째 인자가 요소값이다. 매 흐름마다 반환값은 누적값에 저장된다. image

image


for_each
요소를 받는 클로저를 전달해서 단순 순회를 하는 녀석이다.
중첩 순환식에서 가끔 쓸만한것같다. image

image


take
정수를 하나 전달받는데, 이터레이터가 지금 가리키는 부분부터 그 정수의 개수만큼만 추출, 이터레이터를 생성해서 반환한다. image

image


collect (★★★★★)
아주 유용한 메서드중 하나다.
현재 이터레이터의 값들을 모아서 컬렉션으로 반환해준다.
반환타입이 제너릭이기 때문에, 유연하게 사용될 수 있다. map이나 filter같은걸로 처리해놓은 값들을 다시 묶어서 저장하기 좋다. image

image


sum
이럴거 저럴거 없이 죄다 더해서 반환해준다.
반환타입이 제너릭임에 유의하자 image

image


product
이건 죄다 곱해준다. image

image


rev
이터레이터를 반대로 뒤집어서 반환한다. image

image


cycle
이건... 이터레이터의 끝과 처음을 이어서 원형으로 뱅뱅 돌게 하는 거다.
그래서 아래의 코드는 무한루프를 발생시킨다. image

image


이것들 말고도 많은데, 일단 여기까지



참조
https://doc.rust-lang.org/stable/std/iter/trait.Iterator.html