0Pricing
Scala for Backend Engineering & Functional Programming · 강의

지연성 이해하기

필요할 때만 값을 계산해 보세요.

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

지연성이란 무엇인가요

Scala에서는 대부분의 값이 엄격하게 평가됩니다. 즉, 정의하는 순간 계산됩니다. 지연성은 이 동작을 뒤집습니다. 지연 값은 처음 필요할 때만 계산되며, 그보다 먼저 계산되지 않습니다.

계산 비용이 크거나 실패할 수 있거나 아예 사용되지 않을 수도 있을 때 지연성이 중요합니다. 아무도 요청하지 않은 작업에 비용을 지불할 이유가 있을까요?

엄격한 val

일반적인 val은 다시 읽지 않더라도 오른쪽 식을 즉시 평가합니다.

이 코드를 실행하고 "computing"이 "after"보다 먼저 출력되는지 확인하십시오. 작업은 정의할 때 수행됩니다.

object Demo extends App {
  val x = { println("computing"); 42 }
  println("after")
  println(x)
}

lazy val

val 앞에 lazy를 붙이면 처음 접근할 때까지 평가가 지연됩니다.

여기서는 "after"가 먼저 출력되고, x를 읽을 때만 "computing"이 출력됩니다. 결과도 캐시되므로 본문은 최대 한 번만 실행됩니다.

object Demo extends App {
  lazy val x = { println("computing"); 42 }
  println("after")
  println(x)
  println(x)
}

이름으로 전달하는 매개변수

=> A로 선언된 매개변수는 이름으로 전달됩니다. 즉, 메서드 내부에서 사용하기 전까지 인수가 평가되지 않습니다.

이것이 지연성의 기본 구성 요소입니다. LazyList는 이름으로 전달하는 매개변수를 사용하므로 요청하기 전까지 꼬리가 계산되지 않습니다.

def maybe(cond: Boolean, value: => Int): Int =
  if (cond) value else 0

val r = maybe(false, { println("side"); 99 })
// "side" never prints; value was unused

LazyList 만나기

LazyList는 Scala의 지연 시퀀스입니다(2.13 이상에서는 이전의 Stream을 대체했습니다). 머리는 즉시 평가되지만 꼬리는 지연됩니다.

요소는 필요할 때 생성되고 한 번 계산되면 메모이제이션되므로 같은 셀을 두 번 다시 계산하지 않습니다.

val ll = LazyList(1, 2, 3)
println(ll)
// prints LazyList(<not computed>) until forced

평가 강제하기

LazyList는 평가를 강제하기 전까지 평가되지 않은 상태로 유지됩니다. toList나 foreach를 호출하거나 각 요소를 출력하면 셀의 평가가 강제됩니다.

REPL은 지연된 꼬리에 <not computed>를 표시합니다. 평가를 강제하면 실제 값이 나타납니다.

object Demo extends App {
  val ll = LazyList(1, 2, 3)
  println(ll.toList)
}

#:: 연산자

#::를 사용해 LazyList의 앞에 요소를 추가합니다. 목록의 ::와 달리 #::의 오른쪽 피연산자는 이름으로 전달되므로 필요할 때까지 꼬리가 만들어지지 않습니다.

따라서 나머지 부분을 지연해서 계산하는 시퀀스를 표현할 수 있습니다.

val ll = 1 #:: 2 #:: 3 #:: LazyList.empty
println(ll.head)

메모이제이션

LazyList의 셀이 한 번 계산되면 그 값이 저장됩니다. 다시 읽는 데는 비용이 들지 않으며 값을 생성한 식도 두 번 실행되지 않습니다.

이 코드를 실행해 보십시오. 각 요소를 처음 평가할 때만 "calc"가 출력되고, 반복해서 읽을 때는 출력되지 않습니다.

object Demo extends App {
  val ll = LazyList(1, 2).map { n =>
    println("calc " + n); n * 10
  }
  println(ll.head)
  println(ll.head)
}

지연된 꼬리의 동작

꼬리가 지연되므로 LazyList에 매핑하더라도 실제로 접근하는 요소만 계산됩니다.

여기서는 목록에 요소가 세 개 있어도 머리만 평가되므로 "map"이 한 번만 출력됩니다.

object Demo extends App {
  val r = LazyList(1, 2, 3).map { n =>
    println("map " + n); n + 1
  }
  println(r.head)
}

지연성이 유용한 이유

지연성을 사용하면 사용하지 않는 작업을 피하고, 무한 시퀀스를 만들며, 계산을 어떻게 표현할지와 그중 얼마나 실행할지를 분리할 수 있습니다.

전체 파이프라인은 한 번만 작성하고, 소비자가 가져올 요소의 개수를 결정합니다.

주의할 점

지연성에는 비용도 있습니다. LazyList는 메모이제이션을 사용하므로 머리에 대한 참조를 유지하면 평가된 모든 요소가 메모리에 남습니다. 매우 큰 데이터나 무한 데이터를 다룰 때는 머리를 유지하지 마십시오.

또한 지연 코드의 부수 효과는 예상하지 못한 시점에 실행될 수 있어 디버깅을 혼란스럽게 만들 수 있습니다.

빠른 확인

지연 평가에 대한 이해도를 확인해 보십시오.

복습

엄격한 평가는 작업을 즉시 실행하고, 지연 평가는 필요할 때까지 실행을 미룹니다. lazy val과 이름으로 전달하는 매개변수(=> A)가 이를 위한 기본 요소입니다.

LazyList는 이 요소들을 기반으로 만들어집니다. 머리는 즉시 평가되고, 꼬리는 지연되어 메모이제이션되며, toList나 요소 접근을 통해 평가가 강제됩니다. 다음으로 LazyList를 직접 만들어 보겠습니다.

자주 묻는 질문

“지연성 이해하기” 강의는 무료인가요?

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

“지연성 이해하기”에서 뭘 배우나요?

필요할 때만 값을 계산해 보세요. 브라우저에서 직접 실행하는 실습 코드로 Scala for Backend Engineering & Functional Programming을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

Scala for Backend Engineering & Functional Programming을(를) 시작하는 데 경험이 필요한가요?

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

“지연성 이해하기” 강의는 얼마나 걸리나요?

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

이 Scala for Backend Engineering & Functional Programming 강의에서 코드를 작성하고 실행할 수 있나요?

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

이 강의의 모든 강의

  1. 지연성 이해하기
  2. LazyList 만들기
  3. 무한 스트림
  4. 지연 방식으로 가져오고 필터링하기
← Scala for Backend Engineering & Functional Programming(으)로 돌아가기