-
Kotlin Collection - 3.SequencesKotlin 2021. 10. 24. 18:47
Kotlin Collection은 Sequence라는 Iterable과 대조되는 Container Type을 제공하는데요, 일반적인 Iterable 방식의 Collection과 동작 방식에서 조금의 차이가 있습니다.
Kotlin Collection에서 일반적인 함수형 연산자를 사용하면 Eager Evaluation 방식으로 동작합니다. 여러 함수형 연산자가 체이닝되있을 때, 각 단계를 완전히 수행하고 그 다음 단계를 진행하는 방식입니다. 즉 Collection의 원소에 대해 모두 처리하고 그 다음 연산자를 적용하는 방식이죠.
반면에 Sequence는 Lazy Evaluation 방식으로 동작합니다. 여러 함수형 연산자가 체이닝되있을 때, 원소 하나씩 체이닝 된 연산자를 적용해서 결과를 리턴합니다. 이렇게 되면 결국 모든 Collection의 원소를 순회하지 않고 함수형 연산자가 종료될 수 있습니다. 아래 예시로 한번 더 확인하겠습니다. 또, Sequence는 처리 된 결과를 호출할 때 실질적인 연산이 이루어집니다.
Iterable과 Sequence 차이 예시
공식 문서에 아주 명확하게 차이를 보여주는 예시가 있어서 이번엔 그대로 사용해보겠습니다.
val words = "The quick brown fox jumps over the lazy dog".split(" ") val lengthsList = words.filter { println("filter: $it"); it.length > 3 } .map { println("length: ${it.length}"); it.length } .take(4) println("Lengths of first 4 words longer than 3 chars:") println(lengthsList)
위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.
일반적인 Iterable 방식은 모든 원소에 대해 filter를 적용하고 그 후 결과값 리스트의 모든 원소에 대해 다시 map을 적용하고 이후 take 연산자를 통해 최종적인 결과를 lengthsList에 저장하고 있습니다.
이러한 점이 Eagerly한 특성을 보여주는데요, 처리해야할 연산을 모두 진행하고 그 다음 연산자로 넘어갑니다. 이 동작 방식은 다음 도표로 다시 확인할 수 있습니다.
위의 도표처럼 모든 원소에 대한 처리가 연산자 별로 진행되는 것을 확인할 수 있습니다. 다음으로 Sequence를 보겠습니다.
val words = "The quick brown fox jumps over the lazy dog".split(" ") val wordsSequence = words.asSequence() val lengthsSequence = wordsSequence.filter { println("filter: $it"); it.length > 3 } .map { println("length: ${it.length}"); it.length } .take(4) println("Lengths of first 4 words longer than 3 chars") println(lengthsSequence.toList())
위의 코드를 실행하면 다음과 같은 결과가 출력됩니다.
위와 같은 결과는 마찬가지로 Sequence가 Lazy하다는 것을 보여주는데요, 하나의 원소를 대상으로 모든 연산자를 처리하고 다음 원소를 진행하는 것을 알 수 있습니다. 'The'는 filter 연산을 했지만 length가 3보다 크지 않으므로 통과되지 못하고 Sequence는 다음 원소를 처리합니다.
또, 위의 Iterable과는 다르게 lengthsSequence.toList()에서 실질적인 연산이 이루어지는 것을 확인할 수 있습니다.
위의 도표를 보면 원소별로 모든 단계가 진행된다는 것을 쉽게 확인할 수 있습니다. 위의 연산에서는 take(4)를 호출했으므로 최종적으로 over까지만 연산하고 나머지 원소에 대해서는 처리하지 않게됩니다.
참고 문서
'Kotlin' 카테고리의 다른 글
Kotlin Delegation 사용과 예시 (2) 2022.06.05 Kotlin Collection - 2.Transformation Operation(map, zip, flatten) (0) 2021.10.17 Kotlin Collection - 1. 컬렉션 생성 (0) 2021.10.11 Const val과 val의 차이 (0) 2021.09.03 Kotlin의 고차 함수 (0) 2021.05.23