2. 시퀀스 빌더

  • 코틀린에서는 시퀀스를 생성할 때, 재너레이터 대신에 시퀀스 빌더; sequence { } 를 제공한다.

시퀀스의 특징

  • 지연 계산 (Lazy Evaluation): 시퀀스의 요소는 실제로 필요할 때까지 계산되지 않으므로, 메모리 사용량을 줄이고 성능을 향상시킬 수 있습니다.
  • yield 함수: yield 함수를 사용하여 시퀀스의 다음 요소를 생성합니다.
  • 중간 연산 및 최종 연산: filter, map과 같은 중간 연산을 통해 시퀀스를 변환하고, toList, forEach와 같은 최종 연산을 통해 결과를 얻을 수 있습니다.
  • 무한 시퀀스 생성 가능: generateSequence 함수를 사용하여 무한 시퀀스를 생성할 수 있습니다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
val seq = sequence {
    println("first")
    yield(1)
    println("second")
    yield(2)
    println("third")
    yield(3)
}

fun main() {
    for (num in seq) {
        println("\t, ${num}")
    }
}
//first
//	, 1
//second
//	, 2
//third
//	, 3

중단이 가능하기 때문에 main 함수와 시퀀스 제너레이터가 번갈아가면서 실행된다.

  • 시퀀스 빌더는 내부적으로 중단 함수를 사용하여 지연 계산을 구현합니다.

    • public abstract suspend fun yield(value: T)
  • sequence { ... } 블록 내부에서 yield 함수를 호출하면 해당 시퀀스는 일시 중단되고, 다음 요소가 필요할 때 다시 재개됩니다.

  • 시퀀스 빌더와 시퀀스가 작동하기 위해서는 중단(suspend)이 필요하다.

시퀀스 주의 사항

  • 시퀀스 빌더 내에서는 yield 함수 이외의 중단 함수는 사용할 수 없습니다.
  • 즉, 시퀀스 빌더는 요소 생성과 소비가 동기적으로 이루어져야 합니다.
    • 만약 시퀀스 빌더 내에서 비동기 작업을 처리해야 한다면 Flow를 사용하는 것이 좋습니다.

Reference