PHpullh
학습 라이브러리/Kotlin/Sequence — 지연 평가

KOTLIN · 컬렉션

Sequence — 지연 평가

대용량 데이터 처리 시 불필요한 중간 리스트 생성을 피하는 Sequence.

컬렉션중급SequenceasSequencelazygenerateSequenceyield

핵심 설명

대용량 데이터 처리 시 불필요한 중간 리스트 생성을 피하는 Sequence.

Kotlin code

// 일반 컬렉션 — 각 단계마다 새 리스트 생성
val eagerResult = (1..1_000_000)
    .filter { it % 2 == 0 }    // 500,000개 리스트
    .map { it * it }            // 500,000개 리스트
    .take(5)                    // 5개

// Sequence — 필요한 만큼만 처리 (훨씬 빠름)
val lazyResult = (1..1_000_000).asSequence()
    .filter { it % 2 == 0 }    // 아직 실행 안 됨
    .map { it * it }            // 아직 실행 안 됨
    .take(5)                    // 여기서 실제 실행
    .toList()                   // [4, 16, 36, 64, 100]

// generateSequence — 무한 시퀀스
val fibs = generateSequence(Pair(0, 1)) { (a, b) ->
    Pair(b, a + b)
}.map { it.first }.take(10).toList()
// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]

// sequence 빌더
val naturalNumbers = sequence {
    var n = 1
    while (true) {
        yield(n++)
    }
}
println(naturalNumbers.take(5).toList()) // [1, 2, 3, 4, 5]

학습 팁

원소가 수천 개 이상이거나 처리 중간에 take()로 일부만 사용한다면 Sequence가 유리합니다. 소규모 컬렉션은 오히려 오버헤드가 생깁니다.

주의할 점

toList() 같은 terminal 연산을 호출하지 않으면 Sequence의 filter/map은 실행되지 않습니다.

자주 묻는 질문

Sequence — 지연 평가란 무엇인가요?

대용량 데이터 처리 시 불필요한 중간 리스트 생성을 피하는 Sequence.

Sequence — 지연 평가 학습 시 주의할 점은 무엇인가요?

toList() 같은 terminal 연산을 호출하지 않으면 Sequence의 filter/map은 실행되지 않습니다.