Kotlin(코틀린)의 Sequence에 대해 알아보자
Kotlin에서 List를 사용하는 경우
map이나 filter등의 메소드를 이용해서 원하는 결과를 쉽게 얻을 수 있는데요.
퍼포먼스 측면에서 한가지 생각해야 할 점이 있습니다.
함수를 거칠 때 마다, 매번 list가 연산되어서 반환되기 때문에,
list아이템이 매우 많을 경우,
메소드를 거칠 수록 처리에 대한 부담이 커지게 되는 것인데요.
그런데, sequence의 경우는 lazy하게
최종 메소드가 실행될 때 전체가 실행되어 집니다.
따라서 list에서 iterator가 하듯, 매번 list를 반환에서 넘겨주지 않아도 되므로,
부하가 적어지게 되는 것인데요.
오늘은 이 Sequence에 대해서 정리해 보도록 하겠습니다.
1. Sequence
Sequence를 생성하기 위해서는 아래와 같은 방법을 사용하면 됩니다.
sequenceOf메소드를 이용해서 처음부터 시퀀스로 생성을 하거나,
list에 asSequence()라는 메소드로 시퀀스로 변형을 시켜서 사용할 수 있습니다.
아래의 코드는 둘 다 sequence로 잘 동작합니다.
(generateSequence()메소드를 사용해서도 Sequence를 생성할 수 있지만, 이 글에서는 우선 제외하겠습니다.
필요시 추후에 이 글에서 업데이트 하도록 하겠습니다)
2. Sequence와 Iterable의 비교
그럼 list로 돌려서 iterable을 이용하면 어떻게 되는지 먼저 보고 나서, Sequence로 돌릴때와 비교해 보겠습니다.
아래 코드를 보시면 일정한 문장을 split함수로 List에 넣었는데요.
이 값은 filter나 map을 돌 때마다, 각각 list의 값을 돌면서 실행을 해 줍니다.
그런데, 더욱더 많은 값을 가지고 있는 list였다면,
filter나 map을 많이 하면 할수록 혹은 다른 메소드를 사용할 수록 실행속도가 많이 걸릴텐데요.
이제 Sequence를 보도록 하겠습니다.
take(2)메소드가 호출될 때 sequence는 lazy하게 실행이 되어집니다.
즉 한번에 모든 연산이 진행되므로, sequence의 첫번째 아이템인 brainy가 들어가면서 바로 mapping까지 되어 집니다.
그래서 출력값이 위에서 list의 Iterable과는 다르게 나오는 것이지요.
참고로 sequence를 사용할 때,
map메소드보다는 filter를 먼저 쓰는 것이 효율적이 되므로 이점도 사용하면서 염두해 두는 것이 좋을 것 같습니다.
이상으로 Sequence에 대해서 정리해 보았구요.
Lazy하게 처리하는 개념에 대해서 이해하고,
필요한 부분에 사용하게 된다면 퍼포먼스 향상에 도움이 될 것 같습니다.