Kotlin Academy · 강의

지연 연산

중간 목록 생성을 피합니다

레슨 3/413개 단계

지연 연산은(는) CoddyKit의 무료 Kotlin Academy 강의입니다. 이것은 4개 중 3번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 Kotlin Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

지연 연산

시퀀스의 강력함은 지연 연산에서 나옵니다. 중간 연산은 실행하지 않고 파이프라인을 구성하며, 종단 연산만 요소를 파이프라인으로 통과시킵니다. 따라서 중간 목록을 만들지 않습니다.

중간 목록 없음

컬렉션에서는 각 map과 filter가 새 목록을 할당합니다. 시퀀스에서는 이러한 임시 목록을 만들지 않고 모든 단계로 요소를 차례로 전달합니다.

fun main() {
    val result = (1..6).asSequence()
        .map { it * it }
        .filter { it % 2 == 0 }
        .toList()
    println(result)
}

지연 평가 관찰

종단 연산이 없으면 람다는 하나도 실행되지 않습니다. 파이프라인은 소비될 때까지 단순한 실행 절차일 뿐입니다.

fun main() {
    val pipeline = (1..3).asSequence()
        .map { println("map $it"); it }
    println("Built pipeline, nothing ran")
    pipeline.toList()
}

take가 작업량을 제한합니다

take(n)은 지연되는 중간 연산입니다. 무한 생성기와 함께 사용하면 n개의 요소를 생성한 뒤 멈춥니다.

fun main() {
    val firstThree = generateSequence(1) { it + 1 }
        .map { it * 10 }
        .take(3)
        .toList()
    println(firstThree)
}

first의 조기 종료

first와 같은 종단 연산은 필요한 값을 얻는 즉시 멈추므로 나머지 요소는 전혀 처리하지 않습니다.

fun main() {
    val result = (1..1000).asSequence()
        .map { println("processing $it"); it }
        .first { it > 3 }
    println("Found $result")
}

요소별 처리 흐름

시퀀스에서는 요소 1이 map을 거쳐 filter를 통과한 다음 요소 2가 같은 과정을 거치는 식으로 처리됩니다. 이러한 순서 덕분에 조기 종료가 가능하고 모든 결과를 한꺼번에 저장할 필요가 없습니다.

fun main() {
    listOf(1, 2, 3, 4).asSequence()
        .filter { println("filter $it"); it % 2 == 0 }
        .map { println("map $it"); it * 10 }
        .toList()
}

takeWhile 및 dropWhile

takeWhile은 조건자가 거짓이 될 때까지 요소를 내보내고, dropWhile은 조건자가 참인 동안 앞부분의 요소를 건너뜁니다. 둘 다 지연 연산입니다.

fun main() {
    val nums = generateSequence(1) { it + 1 }
    println(nums.takeWhile { it < 5 }.toList())
}

불필요한 계산 방지

소비되기 전에는 아무것도 실행되지 않고 소비도 일찍 멈출 수 있으므로, 비용이 큰 변환은 실제로 종단 연산까지 도달하는 요소에만 적용됩니다.

fun main() {
    val result = (1..100).asSequence()
        .map { it * 2 }
        .filter { it > 10 }
        .take(2)
        .toList()
    println(result)
}

시퀀스 재사용

대부분의 시퀀스는 여러 번 반복할 수 있으며, 반복할 때마다 파이프라인이 다시 실행됩니다. 하지만 반복자와 같은 일회성 원천에서 만들어진 시퀀스는 한 번만 소비할 수 있습니다. 원천의 특성을 항상 확인해야 합니다.

fun main() {
    val seq = sequenceOf(1, 2, 3).map { it * 2 }
    println(seq.toList())
    println(seq.sum())
}

상태 유지 연산과 무상태 연산

대부분의 연산은 한 번에 하나의 요소를 처리하므로 무상태입니다. 하지만 sorted나 distinct와 같은 일부 연산은 상태를 유지해야 하므로 모든 요소를 임시 저장하거나 훑어봐야 하며, 지연 평가의 이점이 줄어듭니다.

fun main() {
    val result = sequenceOf(3, 1, 2, 1).distinct().sorted().toList()
    println(result)
}

지연 평가의 효과

지연 연산은 중간 목록을 건너뛰어 메모리를 절약하고, 조기 종료를 사용해 시간을 절약합니다. 데이터가 클수록, 그리고 종단 연산이 결과를 많이 걸러낼수록 이점이 커집니다.

빠른 확인

시퀀스 체인의 람다는 실제로 언제 실행됩니까?

복습

지연 연산은 종단 연산이 소비할 때만 실행되는 파이프라인을 구성하므로 중간 목록을 만들지 않고, first, take, takeWhile을 사용한 조기 종료를 가능하게 합니다. sorted와 같은 상태 유지 연산은 주의해야 합니다. 다음에는 시퀀스가 컬렉션보다 유리한 경우를 알아봅니다.

무료로 시작

AI 튜터와 함께 Kotlin을(를) 배우세요 — 무료

브라우저에서 실제 코드를 작성하고 실행하며, 24/7 AI 튜터로부터 즉각적인 도움을 받고, 웹이나 앱에서 중단한 부분부터 계속 학습하세요.

코스
51
레슨
203

자주 묻는 질문

“지연 연산” 강의는 무료인가요?

네 — “지연 연산” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 Kotlin Academy 강의 전체를 잠금 해제할 수 있습니다. Kotlin Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“지연 연산”에서 뭘 배우나요?

중간 목록 생성을 피합니다 브라우저에서 직접 실행하는 실습 코드로 Kotlin Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Kotlin Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 Kotlin Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 3번째 강의입니다.

“지연 연산” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 Kotlin Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 Kotlin Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. 시퀀스를 사용하는 이유
  2. 시퀀스 만들기
  3. 지연 연산
  4. 시퀀스와 컬렉션 비교
← Kotlin Academy(으)로 돌아가기