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

2장 - 시퀀스 빌더

by 띵커베르 2024. 1. 13.
728x90
  • 코틀린 시퀀스는 데이터를 연속적으로 처리하는 데 사용되는 컬렉션 타입 중 하나
    • 요구되는 연산을 최소한으로 수행
    • 무한정이 될 수 있음
    • 메모리 사용이 효율
  • 시퀀스 좀 알고 갈까
    • 리스트를 사용할 경우
      • val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
        val result = mutableListOf<Int>()

        for (number in numbers) {
            if (number % 2 == 0) {
                val squared = number * number
                result.add(squared)
            }
        }

        println(result) // [4, 16, 36, 64, 100]
        • 위 코드는 리스트를 사용하여 짝수를 찾고 제곱한 값을 구합니다. 중간 결과를 담을 result 리스트를 생성하고, 반복문을 통해 필터링 및 제곱을 수행합니다.
    • 시퀀스를 사용한 경우
      • val numbers = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
        val result = numbers.asSequence()
            .filter { it % 2 == 0 } // 짝수 필터링
            .map { it * it }        // 제곱 연산
            .toList()                // 최종 결과를 리스트로 변환

        println(result) // [4, 16, 36, 64, 100]
        • 위 코드는 시퀀스를 사용하여 짝수를 찾고 제곱한 값을 구합니다. asSequence()를 사용하여 리스트를 시퀀스로 변환하고, filter로 짝수를 필터링하며, map으로 제곱 연산을 합니다. 중간 결과를 생성하지 않고 필요한 시점에서만 연산이 수행되므로, 메모리와 연산을 더 효율적으로 사용합니다.
      • 그래서 뭐가 좋은데?
        • 지연 평가 (Lazy Evaluation):
          • 시퀀스는 연산을 지연시킵니다.
          • 중간 연산인 filter, map 등이 호출되더라도 실제 연산이 수행되지 않고 대기함.
          • 모든 연산을 끝까지 실행하지 않고, 필요한 시점에서만 실행한다는 의미.
            • 연산을 중간에 중단하거나 조건에 따라 실행 여부를 결정할 수 있다.
            • 모든 데이터를 한 번에 메모리에 로드하지 않고, 데이터를 순차적으로 읽어들이므로 메모리 효율성 향상.
        • 중간 결과 생성 최소화:
          • 중간 결과를 생성하지 않고 연산을 수행합니다.
          • 예를들어 리스트를 사용할 때 중간 결과를 저장하기 위해 새로운 리스트를 만들어야 함.
          • 시퀀스는 중간 결과를 생성하지 않고 필터링 및 매핑 연산을 미뤄두어, 중간 결과를 생성하는 비용이 없어지므로 연산이 더 효율적으로 수행
        • 이러한 장점은 대용량 데이터를 처리할 때 더욱 좋음
        • 주의할점?
          • 정말 많은 데이터 ex)몇억개의 데이터를 처리할때는 메모리 상황과 효율성을 중요시 해야할듯.
            • 청크 기반으로 데이터를 n 개 씩 나눠서 처리를 하던지.
            • 코루틴을 사용하여 병렬로 처리를 하던지
728x90

댓글