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은 실행되지 않습니다.
Continue Learning
Kotlin 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.