# 반복자의 도입부

Rust에서 반복자(iterator)는 컬렉션이나 범위 같은 연속된 자료를 순회하면서 필요한 처리를 수행할 수 있도록 돕는 핵심 요소다. 반복자는 제어 흐름을 좀 더 간결하고 유연하게 작성하도록 해주며, for나 while 같은 기본 반복문을 대체하거나 보완하는 역할도 수행한다. Rust의 반복자는 일반적인 반복 구조에 비해 메모리 사용과 성능을 더욱 직관적으로 제어할 수 있는 장점을 제공한다.

반복자를 활용해 특정 범위의 숫자를 순회하고자 할 때는 Range 타입을 자주 사용한다. 예를 들어 1부터 5까지 반복하며 무언가를 출력하거나 계산하려 한다면, 다음과 같은 코드로 작성할 수 있다.

```
fn main() {
    for i in 1..6 {
        println!("현재 숫자: {}", i);
    }
}
```

위 예시에서 1..6은 1에서 5까지 반복되는 Range 타입의 값을 생성한다. 반복자는 내부적으로 각 요소에 접근할 수 있는 메커니즘을 갖추고 있으며, for 문을 사용할 때 Rust는 이 메커니즘을 자동으로 인식하여 순회 과정을 처리한다. 숫자 범위뿐만 아니라 벡터 같은 컬렉션에서도 동일한 방식으로 작동한다.

Rust 컬렉션에서 반복자를 만드는 대표적인 방법은 iter, into\_iter, iter\_mut 함수다. 예를 들어 Vec 타입의 벡터가 있을 때, 다음과 같이 다양한 방식으로 반복자를 생성할 수 있다.

```
fn main() {
    let numbers = vec![10, 20, 30];

    // 불변 참조를 기반으로 하는 반복자
    for num in numbers.iter() {
        println!("불변 참조 요소: {}", num);
    }

    // 값을 직접 소비(소유권 이동)하는 반복자
    for num in numbers.into_iter() {
        println!("소유권 이동 요소: {}", num);
    }
}
```

numbers.iter()는 벡터를 불변 참조 형태로 순회할 수 있는 반복자를 반환하며, numbers.into\_iter()는 벡터를 소비하여 각 요소의 소유권을 직접 가져오는 반복자를 생성한다. 소유권 이동이 일어나므로 into\_iter 이후에는 원본 벡터를 더 이상 사용할 수 없게 된다. 만약 벡터의 각 요소를 수정하면서 순회해야 한다면 iter\_mut 함수를 사용해 가변 참조 기반의 반복자를 만들 수 있다.

Rust의 반복자는 대부분 표준 라이브러리에 정의되어 있는 Iterator 트레이트를 구현한다. Iterator 트레이트는 next 메서드를 통해 순회할 때마다 Some(요소) 또는 None을 반환하도록 요구한다. 반복자를 직접 정의하고 싶다면, Iterator 트레이트의 next 메서드를 구현해주면 된다. 하지만 일반적인 경우에는 표준 라이브러리나 컬렉션이 제공하는 기본적인 반복자를 활용하게 된다.

반복자의 또 다른 강점은 클로저(closure)와 결합하여 고차 함수(higher-order function) 형식으로 다양한 연산을 수행할 수 있다는 점이다. map, filter, collect 같은 메서드는 기존 반복자의 각 요소를 변환하거나 조건으로 걸러낸 뒤 새로운 컬렉션으로 모을 수 있다. 이러한 메서드는 필요에 따라 연산을 미루는(lazy evaluation) 특성을 가지기도 하여, 메모리와 계산 비용을 효율적으로 제어할 수 있게 만든다.

반복자를 이해하는 첫 단계는 한 번에 하나씩 요소를 가져오는 구조를 숙지하고, for 문처럼 반복자를 사용하는 기본 제어 흐름 패턴에 익숙해지는 것이다. 여기에서 더 나아가 반복자 어댑터(adapter)를 활용하면, 원하는 연산을 정교하게 구성해나갈 수 있다. 예를 들어 map은 기존 요소를 변환하고, filter는 조건에 맞는 요소만을 남기고, take나 skip 같은 어댑터는 요소의 개수를 제한하거나 건너뛸 수 있다.

Rust에서 반복자는 단순한 반복 도구를 넘어 제어 흐름 전체를 간결하고 안전하게 만들어준다. 데이터를 순회하면서 변환, 조건 분기, 누적 연산 등을 수행할 때, 반복자를 기반으로 한 다양한 메서드를 적절히 결합하기만 하면 별도의 중간 자료 구조 없이도 원하는 처리를 구현할 수 있다. 이렇듯 반복자는 제어 흐름에 유연함과 성능, 안전성을 동시에 부여하는 중요한 개념이므로, 앞으로의 학습에서 여러 방면으로 만나게 될 것이다.
