제너레이터와 시퀀스를 비교해보면서 코틀린 코루틴이 활용하는 시퀀스에 대해 알아본다.
시퀀스는 기존의 컬렉션과 다르게 중간 임시 컬렉션을 사용하지 않고 컬렉션 연산을 가능하게 해준다.
이를 보고 시퀀스는 필요할 때마다 지연 연산을 수행한다고 말한다.
코틀린은 시퀀스를 활용해 코루틴을 중단하고 실행한다.
fun main() {
var i = 0
(1..1000).filter {
println("filter 안:$it")
i++
it % 2 == 0
}.map {
println("map 안:$it")
i++
it + 1
}.first()
println("i: $i")
}
/*
filter 안:1
filter 안: 2
...
filter 안: 1000
map 안:2
map 안:4
...
map 안:1000
i: 1500
*/
위 코드는 모든 원소에 대해 filter
를 적용해서 중간 임시 컬렉션을 만들고 map
은 이 컬렉션의 모든 원소에 대해 처리할 것이다. 이 코드에 시퀀스를 적용할 경우 아래와 같이 다른 결과가 출력된다.
fun main() {
var i = 0
(1..1000).asSequence().filter {
println("filter 안:$it")
i++
it % 2 == 0
}.map {
println("map 안:$it")
i++
it + 1
}.first()
println("i: $i")
}
/*
filter 안:1
filter 안:2
map 안:2
i: 3
*/
시퀀스는 지연 연산을 통해 수행해야 할 모든 중간 연산을 기억했다가 최종 연산이 호출되면 원소를 하나씩 차례로 호출한다. 실행하다가 최종 연산의 모든 결과를 찾으면 즉시 연산을 종료한다.
시퀀스는 아래와 같은 특징을 가진다.