Kotlin

Sequence 란 무엇인가?

JUN0126 2023. 7. 23. 17:08

Sequence란?

컬렉션에서 map, filter 등에서 실행되는 결과는 해당 컬렉션을 즉시(eagerly) 생성한다. 이는 컬렉션 함수를 연속으로 사용하게 된다면 

사용되는 단계마다 새로운 컬렉션에 임시로 담고 다음 함수를 실행한다는 의미이다.

그러나 지연(lazy) 연산의 특징을 가진 Sequence 에서는 중간 결과를 새로운 컬렉션에 담지 않고 연산을 연속으로 사용할 수 있다.

중간 결과를 저장하는 컬렉션이 생기지 않기 때문에 원소가 많은 경우에는 성능이 눈에 띄게 좋아진다.

또한 Sequence 는 결과값을 반환하는 map,filter 와 같은 결과 값을 반환하는 컬렉션 함수만 있다는 점을 참고해야한다

 

 

그렇다면 어떤 방법으로 Sequence는 연속적인 함수의 계산 값을 반환하는 것일까?

Sequence의 결과 반환 

시퀀스에 대한 연산은 중간 연산과 최종 연산으로 나누어 지는데, 여러개의 함수의 연산에 있어 중간에 실행되는 함수는 또다른 시퀀스를 반환하며 최종 실행되는 함수에 종료함수(toList(),Sum 등) 함수가 실행되었을 때 최종적으로 계산의 결과가 이루어 진다.

종료함수가 선언되지 않은 시퀀스는 실제로 결과를 리턴하지 않는다.

 

toList가 선언되지 않았을 경우 중간 내용을 계산하지 않음

=== 시퀀스 최종연산 비교 코드 작성 ===

 

 

컬렉션과 시퀀스의 실행되는 방법이 다르다.

Sequence 생성 방법

1. 컬렉션에 asSequence() 호출

  - 컬렉션.asSequence() 

2. sequenceOf() 사용

  - sequenceOf(1, 2, 3 ... ) 

3. generateSequence 함수 사용

 - generateSequence(초기값) { 반복 실행 값 }

    -> 계속하여 반복하다가 null 이 리턴 될 경우 해당 시퀀스 종료 

 

 

Sequence을 사용해야 할 떄

위와 같은 예시만 봤을 때는 불필요한 임시 컬렉션을 만들지 않는 Sequence는 상당히 효율적으로 보일 수 있다.

그러나 Sequence 선언 후 함수 계산 시에는 컬렉션은 만들지 않지만 객체가 만들어져 또다른 오버헤드가 발생할 수 있다.

이에 따라 많은 양의 데이터(원소) 를 계산하며, 복잡한 계산식을 사용해야 할 때 Sequence를 사용하여 호출 양을 줄일 수 있다.

'Kotlin' 카테고리의 다른 글

Kotest  (0) 2023.06.08