[Rust] Iterator 완벽 가이드: 이터레이터 개념, 예제, 그리고 최적화

[Rust] Iterator 완벽 가이드: 이터레이터 개념, 예제, 그리고 최적화

Rust/Concepts
민호이 민호이 2025. 1. 12. 20:26
목차
  1. Rust에서 Iterator(이터레이터) 완벽 가이드
  2. 1. Iterator의 주요 특징
  3. 지연 평가(Lazy Evaluation)
  4. 체인 호출
  5. 컬렉션 호환성
  6. 2. Rust Iterator란?
  7. 3. Iterator 작동 방식
  8. 예제: next 메서드 사용
  9. 4. Iterator 어댑터와 소비자
  10. 4.1 Iterator 어댑터
  11. 4.2 Iterator 소비자
  12. 5. Iterator 활용 예시
  13. 예시 1: 벡터에서 짝수만 선택
  14. 예시 2: 두 배열 병합
  15. 예시 3: 요소와 인덱스 출력
  16. 6. 시간 복잡도
  17. F&Q 코너
  18. 결론

Rust에서 Iterator(이터레이터) 완벽 가이드

Rust Iterator(이터레이터)는 데이터를 효율적으로 순회하며 처리하는 핵심 도구입니다. 특히, 지연 평가(Lazy Evaluation)와 체인 호출, 컬렉션 호환성 같은 강력한 기능은 복잡한 작업도 간결하고 최적화된 방식으로 수행할 수 있게 해줍니다. 이 가이드는 Rust의 Iterator 사용법, 시간 복잡도, 예제 코드까지 다뤄, Rust Iterator 활용을 극대화할 방법을 제공합니다. Rust Iterator를 잘 이해하면, 데이터 처리 성능과 코드 가독성을 모두 개선할 수 있습니다.


1. Iterator의 주요 특징

지연 평가(Lazy Evaluation)

Iterator는 데이터를 즉시 처리하지 않고, 필요할 때만 계산을 수행합니다. 이는 불필요한 계산을 방지하고 성능을 최적화하는 데 도움을 줍니다. 예를 들어, filter와 map을 함께 사용해 데이터를 변환할 때, 필요한 데이터만 계산하므로 성능이 매우 효율적입니다.

체인 호출

map, filter, collect 같은 메서드를 체인 형태로 호출하여 데이터 변환과 필터링 작업을 한 줄로 표현할 수 있습니다. 이는 복잡한 데이터 처리 로직을 간결하게 구현하는 데 유용합니다.

let numbers = [1, 2, 3, 4];
let result: Vec<_> = numbers.iter()
.filter(|x| **x % 2 == 0)
.map(|x| x * 2)
.collect();
assert_eq!(result, vec![4, 8]); // 짝수를 선택하고 2배로 변환

컬렉션 호환성

Rust의 Iterator는 배열(Array), 벡터(Vec), 슬라이스(Slice) 등 다양한 컬렉션에서 사용할 수 있습니다. 각 컬렉션은 적절한 메서드를 통해 반복자를 생성하며, 데이터 구조에 상관없이 일관된 방식으로 사용할 수 있습니다.


2. Rust Iterator란?

Rust의 Iterator는 반복 가능한 데이터 구조에서 요소를 순회하며 처리할 수 있도록 설계된 인터페이스입니다. Iterator는 std::iter::Iterator 트레이트로 정의되며, 아래와 같은 기본 구조를 가집니다:

pub trait Iterator {
type Item;
fn next(&mut self) -> Option<Self::Item>;
}
  • type Item: 반복할 데이터의 타입입니다.
  • next 메서드: 다음 요소를 반환하며, 더 이상 요소가 없을 경우 None을 반환합니다. next를 통해 Iterator의 동작을 상세히 조정할 수 있습니다.

3. Iterator 작동 방식

Rust에서 Iterator는 데이터를 순회하기 위해 next 메서드를 호출합니다. 이를 통해 각 요소를 차례대로 가져옵니다. 이 방식은 명시적이며, Iterator의 동작 방식을 쉽게 이해할 수 있습니다.

예제: next 메서드 사용

let numbers = [10, 20, 30];
let mut iter = numbers.iter();
assert_eq!(iter.next(), Some(&10)); // 첫 번째 요소 반환
assert_eq!(iter.next(), Some(&20)); // 두 번째 요소 반환
assert_eq!(iter.next(), Some(&30)); // 세 번째 요소 반환
assert_eq!(iter.next(), None); // 요소 없음
  • iter(): 데이터의 참조를 반복.
  • into_iter(): 데이터의 소유권을 반복.
  • iter_mut(): 데이터의 가변 참조를 반복.

4. Iterator 어댑터와 소비자

4.1 Iterator 어댑터

Iterator 어댑터는 기존 Iterator를 변환하거나 새로운 기능을 추가한 새로운 Iterator를 반환합니다. 이를 통해 데이터 변환과 필터링 같은 작업을 효율적으로 수행할 수 있습니다.

  • map: 각 요소를 변환합니다.
    • 예: 배열의 각 숫자에 2를 곱하기.
  • filter: 조건을 만족하는 요소만 선택합니다.
    • 예: 짝수만 필터링.
  • chain: 두 Iterator를 연결합니다.
    • 예: 두 배열 병합.
  • zip: 두 Iterator의 요소를 병렬로 묶습니다.
    • 예: 두 배열의 값을 튜플로 묶기.
let numbers = [1, 2, 3, 4];
let doubled: Vec<_> = numbers.iter().map(|x| x * 2).collect();
assert_eq!(doubled, vec![2, 4, 6, 8]);
let even_numbers: Vec<_> = numbers.iter().filter(|x| **x % 2 == 0).collect();
assert_eq!(even_numbers, vec![2, 4]);

4.2 Iterator 소비자

Iterator 소비자는 데이터를 소모하여 최종 결과를 반환합니다. 이들은 이터레이터의 데이터를 처리하여 원하는 결과물을 생성하는 데 사용됩니다.

  • collect: 모든 요소를 컬렉션으로 변환.
  • sum: 요소의 합계를 계산.
  • count: 요소의 개수를 반환.
  • fold: 초기값과 클로저를 사용해 반복적으로 값을 계산.
let numbers = [1, 2, 3, 4];
let sum: i32 = numbers.iter().sum(); // 합계 계산
assert_eq!(sum, 10);
let count = numbers.iter().count(); // 요소 개수
assert_eq!(count, 4);
let product: i32 = numbers.iter().fold(1, |acc, &x| acc * x);
assert_eq!(product, 24); // 모든 요소의 곱

5. Iterator 활용 예시

예시 1: 벡터에서 짝수만 선택

let numbers = vec![1, 2, 3, 4, 5, 6];
let even_numbers: Vec<_> = numbers.into_iter().filter(|x| x % 2 == 0).collect();
assert_eq!(even_numbers, vec![2, 4, 6]);

설명: filter 메서드로 짝수 조건을 적용하고, 결과를 collect를 사용해 벡터로 변환합니다.

예시 2: 두 배열 병합

let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined: Vec<_> = arr1.iter().chain(arr2.iter()).cloned().collect();
assert_eq!(combined, vec![1, 2, 3, 4, 5, 6]);

설명: chain 메서드로 두 배열을 연결하고, cloned를 사용해 값의 소유권을 복사합니다.

예시 3: 요소와 인덱스 출력

let chars = ['a', 'b', 'c'];
let enumerated: Vec<_> = chars.iter().enumerate().collect();
assert_eq!(enumerated, vec![(0, &'a'), (1, &'b'), (2, &'c')]);

설명: enumerate 메서드는 각 요소에 인덱스를 추가해 (index, value) 튜플을 생성합니다.


6. 시간 복잡도

Iterator의 주요 메서드별 시간 복잡도는 다음과 같습니다.

메서드 시간 복잡도 설명
next O(1) 다음 요소를 반환합니다.
map O(n) 각 요소를 변환합니다.
filter O(n) 조건에 맞는 요소를 선택합니다.
collect O(n) 모든 요소를 컬렉션으로 모읍니다.
count O(n) 모든 요소를 세어 반환합니다.
fold O(n) 요소를 초기값과 함께 반복적으로 계산합니다.

F&Q 코너

Q1. Iterator와 for 루프의 차이점은 무엇인가요?

  • Iterator는 함수형 스타일로 작업을 처리하며, 체인 호출로 간결하게 작성할 수 있습니다. 반면 for 루프는 명령형 스타일로 반복 작업을 수행합니다. 이터레이터가 가지는 가장 큰 특징입니다.

Q2. into_iter와 iter의 차이는 무엇인가요?

  • into_iter: 이터레이터의 데이터의 소유권을 반복.
  • iter: 이터레이터의 데이터의 참조를 반복.

Q3. Iterator가 lazy한 이유는 무엇인가요?

  • 이터레이터는 필요할 때만 계산을 수행함으로써 성능을 최적화하고 메모리 낭비를 줄입니다.

Q4. fold 메서드는 언제 사용하나요?

  • 복잡한 누적 계산이 필요할 때 사용합니다. 예: 합계, 곱, 평균 계산 등.

결론

Rust의 Iterator는 데이터를 효율적이고 간결하게 처리할 수 있는 강력한 도구입니다. 지연 평가, 체인 호출, 컬렉션 호환성, map과 filter 같은 다양한 어댑터 메서드는 데이터 처리 성능을 극대화하며, 코드 가독성을 개선합니다. Rust Iterator(이터레이터)를 제대로 이해하고 활용해, Rust 코드를 최적화하고 더욱 직관적으로 작성하세요. 이터레이터를 통하여 더 좋은 코드를 작성해부세요.

저작자표시 비영리 변경금지 (새창열림)
  1. Rust에서 Iterator(이터레이터) 완벽 가이드
  2. 1. Iterator의 주요 특징
  3. 지연 평가(Lazy Evaluation)
  4. 체인 호출
  5. 컬렉션 호환성
  6. 2. Rust Iterator란?
  7. 3. Iterator 작동 방식
  8. 예제: next 메서드 사용
  9. 4. Iterator 어댑터와 소비자
  10. 4.1 Iterator 어댑터
  11. 4.2 Iterator 소비자
  12. 5. Iterator 활용 예시
  13. 예시 1: 벡터에서 짝수만 선택
  14. 예시 2: 두 배열 병합
  15. 예시 3: 요소와 인덱스 출력
  16. 6. 시간 복잡도
  17. F&Q 코너
  18. 결론
'Rust/Concepts' 카테고리의 다른 글
  • [Rust] 라이프타임: 5분만에 예제와 함께 이해하기!
  • [Rust] Fn, FnMut, FnOnce: 예시를 통한 완벽 비교
  • [Rust] 제네릭 타입 정리: Generic과 Trait 완벽 가이드
  • [Rust] 에러 처리와 panic: 안정적인 코드 작성법
민호이
민호이
민호이
ChungCODE
민호이
전체
오늘
어제
  • Categories (128)
    • 스포츠 (6)
    • 인공지능 (5)
    • 주식 (6)
      • 경제 주식 전망 (5)
      • ETF (9)
    • CSAPP (4)
      • Lab Session (4)
      • Concepts (0)
    • C (19)
    • Java (24)
    • Rust (44)
      • Concepts (27)
      • Libraries (17)
    • PS (2)
    • 국내 소식 (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 수학
  • 최소공배수
  • 유클리드 호제법
  • c++
  • 최대공약수
  • 알고리즘
  • C
  • 코드업

최근 댓글

최근 글

반응형
hELLO · Designed By 정상우.v4.2.1
민호이
[Rust] Iterator 완벽 가이드: 이터레이터 개념, 예제, 그리고 최적화
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.