더 이상 권장되지 않음: 비지역 반환

더 이상 권장되지 않음: 비지역 반환 (Nonlocal Returns)

중첩된 익명 함수에서 반환하는 것(비지역 반환)은 Scala 3.2.0부터 더 이상 권장되지 않아요(deprecated). 이 패턴이 왜 문제인지 살펴보고, 더 나은 대안을 함께 보도록 할게요.

출처: Scala 3 Reference

본문

중첩된 익명 함수에서 반환하는 것은 Scala 3.2.0부터 더 이상 권장되지 않아요.

비지역 반환은 scala.runtime.NonLocalReturnException을 던지고 잡는 방식으로 구현돼요. 그런데 이건 프로그래머가 의도한 동작인 경우가 드물어요. 예외를 던지고 잡는 데 숨겨진 성능 비용이 있다는 점도 문제예요. 게다가 구현 방식이 새어 나가는(leaky) 성격이라, 모든 예외를 잡는(catch-all) 핸들러가 NonLocalReturnException을 가로챌 수도 있어요.

비지역 반환뿐 아니라 scala.util.control.Breaks API 대신 쓸 수 있는 더 나은 대안은 scala.util.boundaryboundary.break예요.

예시:

import scala.util.boundary, boundary.break
def firstIndex[T](xs: List[T], elem: T): Int =
  boundary:
    for (x, i) <- xs.zipWithIndex do
      if x == elem then break(i)
    -1

더 알아보기 (Learn more)