본문 바로가기
공부/코틀린코루틴:딥다이브(마르친 모스카와)

18장 - 핫 데이터 소스와 콜드 데이터 소스

by 띵커베르 2024. 3. 10.
728x90
  • 채널만으로 부족하다라는 것을 깨닫음.
  • 채널은 값을 핫 스트림으로 가지지만, 콜드 스트림이 필여힐 때가 있음
  • 핫 데이터, 콜드 데이터 차이를 이해하는 것이 소프트웨어적인 측면에서 상당히 유용하다 할 수 있다.
    • List, Set과 같은 컬렉션은 핫 이며,
    • Sequence 와 Stream 은 콜드입니다
    • Channel 은 핫이지만, Flow 와 (Observable, Sigle 과 같은)RxJava 스트림은 콜드입니다.
  • 핫 VS 콜드
    • 핫 데이터 스트림은 열정적이라 데이터를 소비하는 것과 무관하게 원소를 생성하지만
      • 핫 데이터 스트림의 빌더와 연산은 즉각 실행됩니다.
    • 콜드 데이터 스트림은 게을러서 요청이 있을 때만 작업을 수행하며 아무것도 저장하지 않습니다.
      • 콜드 데이터 스트림에서는 원소가 필요할 때까지 실행되지 않습니다.
fun main6_1() {
    val l = buildList {
        repeat(3) {
            add("User $it")
            println("L: Added User $it")
        }
    }

    val l2 = l.map {
        println("L2: Processing $it")
        "Processed $it"
    }

    val s = sequence {
        repeat(3) {
            yield("User $it")
            println("S: Added User $it")
        }
    }

    val s2 = s.map {
        println("S2: Processing $it")
        "Processed $it"
    }

buildList 함수:

buildList는 Kotlin에서 리스트를 구성하는 빌더 패턴의 일부입니다. 이 함수를 사용하면 블록 안에서 리스트의 요소를 동적으로 추가할 수 있습니다. 이 경우 repeat(3)을 사용하여 세 번 반복하며, 각 반복마다 "User $it"라는 문자열을 리스트에 추가합니다. 여기서 $it는 현재 반복의 인덱스를 나타냅니다.
buildList 내에서 리스트에 요소를 추가한 후, 이 리스트는 변경할 수 없는 List로 반환됩니다. 이 코드에서는 l이 그러한 리스트입니다.
따라서 l.map {...} 부분에서는 l 리스트의 각 요소를 순회하며 "L2: Processing $it"를 출력하고, 각 요소 앞에 "Processed "를 붙여 새 리스트 l2를 생성합니다.
sequence 함수:

sequence는 지연된 컬렉션(lazy collection)을 생성하는 함수입니다. 즉, 시퀀스의 요소들은 필요할 때까지 계산되지 않고, 요소들이 요청될 때(iterator를 통해) 실제로 생성됩니다.
이 예제에서 repeat(3)을 사용하여 "User $it"라는 문자열을 시퀀스에 yield하고 있습니다. yield는 시퀀스에 요소를 하나씩 추가합니다. 하지만 이 값들은 s 시퀀스를 실제로 순회하기 전까지 생성되지 않습니다.
s.map {...} 부분에서는 s 시퀀스의 각 요소에 대해 지연 처리가 적용됩니다. 즉, 실제 s2 시퀀스의 요소를 순회하는 시점에 "S2: Processing $it"가 출력되고, "Processed $it"로 변환되는 것입니다.

 

  • 콜드 데이터 스트림은
    • 무한할 수 있다
    • 최소한의 연산만 수행한다
    • 메모리를 적게 사용한다.
  • https://jeong0427.tistory.com/171 참고해도될듯(2장 - 시퀀스빌더)

 

  • 핫 데이터 스트림은
    • 항상 사용 가능한 상태입니다.(각 연산이 최종 연산이 될 수 있다)
    • 여러 번 사용되었을 때 매번 결과를 다시 계산할 필요가 없다.

 

  • 핫 채널, 콜드 플로우
    • 플로우를 생성하는 가장 일반적인 방법은 produce 함수와 비슷한 형태의 빌더를 사용하는 것입니다.
    • 채널은 핫이라 곧바로 계산을 수행합니다.

 

 

728x90

댓글