Rust에서 배열이나 컬렉션을 반복하는 방법은 여러 가지가 있지만, 가장 많이 사용되는 방법은 for 루프와 이터레이터(iterator)를 사용하는 방식입니다. Rust의 반복 패턴은 가독성과 안전성을 중시하는 경향이 있으며, C에서 사용하는 인덱스를 통한 반복이나 Python에서 사용하는 값 자체를 반복하는 방식과 유사하지만, Rust만의 독특한 방식이 있습니다.
Rust에서 일반적으로 사용되는 배열 반복 방법들을 소개하고, 어떤 방법이 통용되는지 설명하겠습니다.
1. for 루프 + iter(): 가장 많이 사용되는 방식
Rust에서 가장 흔하게 사용되는 방법은 for 루프와 iter() 메서드를 사용하는 방식입니다. 이 방식은 Python의 값 자체를 반복하는 방식과 비슷합니다. iter()는 불변 반복자를 반환하므로, 배열이나 벡터의 값을 불변으로 순회할 수 있습니다.
예시:
fn main() {
let arr = [10, 20, 30, 40, 50];
// 배열의 요소를 불변으로 반복
for value in arr.iter() {
println!("{}", value); // 각 값을 출력
}
}
- *arr.iter()*는 배열의 불변 반복자를 반환하고, 각 값을 순회하면서 사용할 수 있습니다.
- Python에서 값 자체를 순회하는 것과 유사하게, Rust에서는 값에 직접 접근하는 것이 일반적입니다.
2. for 루프 + 직접 값 반복: 더 간단한 방법
iter()를 명시하지 않고도, for 루프에서 배열이나 벡터를 바로 반복할 수 있습니다. Rust는 이 경우 자동으로 소유권을 대여(borrowing)하여 값을 불변으로 참조합니다.
예시:
fn main() {
let arr = [10, 20, 30, 40, 50];
// 배열을 직접 반복
for value in arr {
println!("{}", value); // 각 값을 출력
}
}
- 직접 배열을 순회하면 Python에서 배열을 바로 순회하는 것처럼 간결하고 직관적입니다.
- 하지만 이 방식은 배열의 소유권이 이동할 수 있다는 점에서 주의가 필요합니다. 배열은 기본적으로 스택에 저장된 값이므로, 크기가 크지 않은 경우에는 이러한 방식도 자주 사용됩니다.
3. for 루프 + 인덱스 접근 (0..arr.len())
C 스타일의 인덱스를 사용하는 반복도 Rust에서 가능합니다. 인덱스 방식은 배열의 길이와 인덱스를 명시적으로 사용하여 값을 순회하는 방법입니다. Rust에서 이 방식은 보통 인덱스가 필요한 경우(예: 인덱스 기반의 계산이 필요한 경우) 사용됩니다.
예시:
fn main() {
let arr = [10, 20, 30, 40, 50];
// 인덱스를 이용한 반복
for i in 0..arr.len() {
println!("arr[{}] = {}", i, arr[i]); // 인덱스와 값을 함께 출력
}
}
- 0..arr.len(): 배열의 인덱스 범위를 명시적으로 지정하고, 각 인덱스에 대해 배열 요소에 접근할 수 있습니다.
- C 스타일에 익숙한 개발자라면 이 방법을 사용할 수 있지만, Rust에서는 일반적으로 iter() 방식이 더 선호됩니다.
4. enumerate()와 for 루프: 인덱스와 값을 함께 사용할 때
Rust에서는 enumerate()를 사용하여 배열의 인덱스와 값을 동시에 순회할 수 있습니다. 이 방식은 Python의 enumerate()와 유사하며, 인덱스가 필요하면서도 가독성을 높일 수 있는 방식입니다.
예시:
fn main() {
let arr = [10, 20, 30, 40, 50];
// 인덱스와 값을 함께 반복
for (i, value) in arr.iter().enumerate() {
println!("Index: {}, Value: {}", i, value);
}
}
- *arr.iter().enumerate()*는 배열의 불변 반복자와 인덱스를 동시에 반환합니다.
- Python의 enumerate()와 매우 유사한 방식으로, 인덱스와 값을 함께 사용할 수 있어 유용합니다.
5. 가변 배열을 반복하며 값 변경하기 (iter_mut())
배열의 값을 수정하고 싶다면, 가변 참조를 반환하는 iter_mut()을 사용하여 배열의 각 요소를 가변으로 순회할 수 있습니다. 이를 통해 배열의 값을 직접 수정할 수 있습니다.
예시:
fn main() {
let mut arr = [10, 20, 30, 40, 50];
// 배열의 값을 가변으로 순회하면서 수정
for value in arr.iter_mut() {
*value += 5; // 각 값에 5를 더함
}
println!("{:?}", arr); // [15, 25, 35, 45, 55] 출력
}
- arr.iter_mut(): 배열의 가변 참조 반복자를 반환합니다. 이를 통해 배열의 각 요소를 변경할 수 있습니다.
- value: 참조로 반환된 값을 역참조하여 값을 직접 수정할 수 있습니다.
결론: Rust에서 많이 쓰이는 반복 방법
- for 루프 + iter(): 가장 일반적이고 안전한 반복 방식입니다. 값을 불변으로 순회하는 방식이며, Python의 값 반복과 유사합니다.
- 직접 배열 반복: iter() 없이 직접 배열을 순회하는 방식도 흔히 사용됩니다. 소유권 문제가 발생하지 않도록 배열은 불변으로 참조됩니다.
- 인덱스 기반 반복: 인덱스가 필요한 경우, 0..arr.len()과 같은 범위 기반 반복을 사용할 수 있습니다. 이는 C 스타일 반복 방식에 가깝습니다.
- enumerate(): 인덱스와 값을 동시에 사용할 때 자주 사용되며, Python의 enumerate()와 비슷합니다.
- iter_mut(): 배열의 값을 변경할 때 가변 참조 반복자를 사용하는 것이 일반적입니다.
Rust에서는 주로 iter()를 사용한 반복이 가장 통용되며, 소유권과 안전성을 고려해 반복 방식을 선택하는 것이 중요합니다.