0Pricing
Learn Rust Coding · 강의

사용자 정의 반복자

Iterator 구현하기

사용자 정의 반복자은(는) CoddyKit의 무료 Learn Rust Coding 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Learn Rust Coding 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

직접 반복자 만들기

내장 반복자만 사용할 필요는 없습니다. 직접 만든 타입에 Iterator 특성을 구현하면 모든 어댑터와 소비자를 추가 작업 없이 사용할 수 있습니다.

제공해야 하는 것은 Item 타입과 next 메서드뿐입니다.

Counter 구조체

반복자의 상태를 담는 구조체부터 시작합니다. 간단한 카운터에는 현재 값만 있으면 됩니다.

struct Counter {
    count: u32,
}

fn main() {
    let c = Counter { count: 0 };
    println!("start at {}", c.count);
}

next 구현하기

구조체에 Iterator를 구현하세요. type Item을 설정한 다음, next가 상태를 진행하고 종료 조건에 도달하기 전까지 Some을 반환하도록 작성합니다. 종료 조건에 도달하면 None을 반환합니다.

struct Counter { count: u32 }

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.count < 5 {
            self.count += 1;
            Some(self.count)
        } else {
            None
        }
    }
}

fn main() {
    let mut c = Counter { count: 0 };
    println!("{:?}", c.next());
    println!("{:?}", c.next());
}

for 반복문에서 사용하기

next가 있으면 직접 만든 타입도 표준 반복자와 마찬가지로 for 반복문에서 사용할 수 있습니다.

struct Counter { count: u32 }

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.count < 5 { self.count += 1; Some(self.count) } else { None }
    }
}

fn main() {
    for n in (Counter { count: 0 }) {
        print!("{} ", n);
    }
    println!();
}

어댑터와 소비자를 무료로 사용하기

메서드 하나를 구현했기 때문에 전체 반복자 도구를 사용할 수 있습니다. 여기서는 쌍을 이룬 카운터 값들의 제곱을 합합니다.

struct Counter { count: u32 }

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.count < 5 { self.count += 1; Some(self.count) } else { None }
    }
}

fn main() {
    let total: u32 = Counter { count: 0 }.map(|x| x * 2).sum();
    println!("{}", total);
}

생성자 메서드

사용자가 내부 필드에 직접 접근하지 않도록 new 함수를 추가하세요. 이렇게 하면 코드가 더 깔끔해지고 필드를 비공개로 유지할 수 있습니다.

struct Counter { count: u32 }

impl Counter {
    fn new() -> Counter { Counter { count: 0 } }
}

impl Iterator for Counter {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.count < 3 { self.count += 1; Some(self.count) } else { None }
    }
}

fn main() {
    let v: Vec<u32> = Counter::new().collect();
    println!("{:?}", v);
}

피보나치 반복자

반복자는 더 많은 상태를 저장할 수도 있습니다. 피보나치 생성자는 마지막 두 값을 유지하고 각 next 호출마다 값을 갱신합니다.

struct Fib { a: u64, b: u64 }

impl Iterator for Fib {
    type Item = u64;
    fn next(&mut self) -> Option<u64> {
        let current = self.a;
        self.a = self.b;
        self.b = current + self.b;
        Some(current)
    }
}

fn main() {
    let fib = Fib { a: 0, b: 1 };
    let seq: Vec<u64> = fib.take(8).collect();
    println!("{:?}", seq);
}

무한 반복자도 문제없습니다

피보나치 반복자는 None을 반환하지 않으며 무한히 이어집니다. 지연성 덕분에 값이 요청될 때만 생성되므로 안전합니다. take을 사용해 범위를 제한하세요.

struct Fib { a: u64, b: u64 }

impl Iterator for Fib {
    type Item = u64;
    fn next(&mut self) -> Option<u64> {
        let c = self.a;
        self.a = self.b;
        self.b = c + self.b;
        Some(c)
    }
}

fn main() {
    let big = Fib { a: 0, b: 1 }.nth(20);
    println!("{:?}", big);
}

래퍼 타입 순회하기

데이터를 대여하는 도우미 구조체에 Iterator를 구현하는 경우가 많습니다. 여기서는 내부에 저장된 범위에서 두 번째 숫자마다 생성하는 단계 진행자를 만듭니다.

struct EvenUpTo { current: u32, max: u32 }

impl Iterator for EvenUpTo {
    type Item = u32;
    fn next(&mut self) -> Option<u32> {
        if self.current > self.max { return None; }
        let value = self.current;
        self.current += 2;
        Some(value)
    }
}

fn main() {
    let evens: Vec<u32> = (EvenUpTo { current: 0, max: 10 }).collect();
    println!("{:?}", evens);
}

사용자 지정 반복자를 만드는 이유

사용자 지정 반복자를 사용하면 전체 컬렉션을 할당하지 않고 값을 스트리밍할 수 있고, 무한 시퀀스나 계산된 시퀀스를 모델링할 수 있으며, 호출자에게 익숙하고 조합 가능한 인터페이스를 제공할 수 있습니다.

작은 next 메서드 하나로 전체 생태계를 활용할 수 있습니다.

설계 팁

상태를 최소한으로 유지하고, 끝에 도달하면 정확히 한 번 None을 반환하세요. 무한 반복자라면 반환하지 않아도 됩니다. 또한 지연 방식의 비용이 낮게 유지되도록 next 안에서 무거운 작업을 피하세요.

빠른 확인

반복자 특성 구현에 대해 확인해 보세요.

복습

사용자 지정 반복자를 만들었습니다.

  • 구조체에 상태를 저장한 다음 impl Iterator를 작성합니다
  • type Item을 정의하고 next를 작성합니다
  • 어댑터와 소비자를 즉시 추가 작업 없이 사용할 수 있습니다
  • 반복자는 유한하거나 무한할 수 있으며, 무한 반복자의 범위를 제한하려면 take을 사용합니다

자주 묻는 질문

“사용자 정의 반복자” 강의는 무료인가요?

네 — “사용자 정의 반복자” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Learn Rust Coding 강의 전체를 잠금 해제할 수 있습니다. Learn Rust Coding 강의에는 총 4개의 강의가 포함되어 있습니다.

“사용자 정의 반복자”에서 뭘 배우나요?

Iterator 구현하기 브라우저에서 직접 실행하는 실습 코드로 Learn Rust Coding을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Learn Rust Coding을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Learn Rust Coding은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“사용자 정의 반복자” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Learn Rust Coding 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Learn Rust Coding 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. Iterator 트레이트
  2. map, filter, collect
  3. 어댑터와 소비자
  4. 사용자 정의 반복자
← Learn Rust Coding(으)로 돌아가기