Rust에서 for 루프는 반복 가능한(iterable) 항목에 순차적으로 접근하여 원하는 작업을 수행하기 위한 핵심 제어 흐름 구조이다. 이때 반복 가능한 항목은 범위(Range), 배열, 벡터, 이터레이터 등 다양한 형태가 될 수 있다. for 루프는 반복되는 과정에서 각 항목을 자동으로 가져와서 사용할 수 있기 때문에, 인덱스 관리가 필요한 다른 언어의 전통적인 for 루프보다 안전하면서도 간결하게 코드를 작성할 수 있다.
Rust에서 for 루프를 사용하는 간단한 예시는 다음과 같다.
fnmain(){foriin1..5{println!("현재 값: {}",i);}}
위 코드는 1부터 4까지의 정수에 대해 반복을 수행한다. Rust의 범위 표현식 1..5는 시작 값 1부터 4까지를 포함한다. 즉, 상한값인 5는 포함되지 않는다. 만약 상한을 포함하고 싶다면 1..=5와 같이 =를 추가하여 1부터 5까지 반복할 수 있다. 실제로 for 루프는 이터레이터를 순회하는 문법적 설탕(syntactic sugar)이므로, 1..5가 생성하는 Range 구조체는 내부적으로 IntoIterator 트레이트를 구현하고 있다. for 루프는 이러한 IntoIterator를 통해 순회 로직을 자동으로 처리한다.
for 루프는 범위뿐 아니라 배열, 벡터와 같은 컬렉션 자료구조에도 적용 가능하다. 예시는 다음과 같다.
위의 예시에서는 문자열 배열 fruits의 각 원소를 fruit 변수로 받아 사용한다. 배열, 벡터 등은 내부적으로 반복자를 제공하므로 for 루프를 쉽게 사용할 수 있다. 이처럼 for 루프는 인덱스를 직접 다루지 않고도, 각 항목을 순회하며 처리할 수 있어 편의성과 안전성이 높다.
Rust에서는 for 루프가 다른 언어의 전통적인 for(i=0; i<n; i++) 형태와 달리 항상 반복자를 통해 동작한다. 따라서 for 루프에서 다루는 항목은 원하는 경우 구체적인 값을 소비(consume)할 수도 있고 참조를 이용할 수도 있다. 예를 들어 벡터의 원소를 수정하려면 가변 참조가 필요하다. 예시는 다음과 같다.
위 예시에서 &mut numbers는 벡터 numbers에 대한 가변 참조를 반환한다. for 루프는 이 가변 참조를 순회하면서 num을 통해 각 원소를 변경할 수 있다. 만약 벡터의 원소를 단순히 읽기만 한다면 &numbers와 같이 불변 참조를 사용하고, 벡터 소유권을 옮기고 싶다면 for num in numbers와 같이 직접 벡터를 넘겨줄 수도 있다.
for 루프를 통해 튜플이나 구조체 같은 복합 자료형을 다룰 때에는 구조 해체(destructuring) 문법도 사용할 수 있다. 예시는 다음과 같다.
위 예시에서 for 루프는 튜플 원소를 자동으로 해체해 변수 num과 ch에 할당한다. 이렇게 구조 해체를 사용하면 중첩된 데이터 구조를 더욱 직관적으로 다룰 수 있다.
Rust의 for 루프는 내부적으로 반복자(iterator) 메커니즘을 활용하기 때문에, 필요한 경우 map, filter 등의 이터레이터 어댑터 메서드를 연결해 사용할 수도 있다. 다만 일반적인 for 루프 내부에서는 이터레이터 메서드 호출 결과를 다시 재활용하려면 변수에 담거나 즉시 사용하는 방식으로 처리해야 한다. 이터레이터 체이닝과 for 루프를 동시에 사용하기보다는 이터레이터의 메서드를 충분히 활용한 뒤 for 루프에서 최종 결과만 처리하는 식으로 작성하는 경우가 많다.
메모리 안전성과 성능을 모두 고려하는 Rust 특성상, for 루프는 적절한 상황에서 매우 유용하다. C나 C++과 같이 인덱스를 명시적으로 증가시키는 형태의 루프가 필요하더라도, Rust에서는 범위 표현식과 iterator를 결합하여 더욱 안전한 방식으로 같은 동작을 구현할 수 있다. 이미 검증된 범위나 이터레이터 로직을 사용하는 것이 인덱스를 잘못 관리하여 발생할 수 있는 논리적 오류를 예방하는 데 크게 기여한다.
종합하면, for 루프는 Rust의 반복 구조에서 핵심적인 역할을 담당하며, IntoIterator 트레이트를 구현한 모든 자료형에 대해 순회가 가능하다. 배열, 벡터, 슬라이스, 범위 등 다양한 형태의 데이터를 안전하고 간결하게 처리할 때 유용하다. 특히 Rust의 소유권, 빌림, 참조 개념과 결합되어 반복 과정에서 데이터의 소유권 이전 여부나 변경 가능 여부를 명확하게 표시할 수 있다는 점이 큰 장점이다. Rust에서 for 루프를 적절히 활용하면 메모리 안전성과 가독성을 모두 확보하면서 효율적인 반복 코드를 작성할 수 있다.