E097: Tailrec Not Applicable

E097: Tailrec Not Applicable (테일 재귀 최적화 적용 불가)

@tailrec 어노테이션을 붙였는데, 정작 테일 재귀 최적화를 적용할 수 없는 메서드에서 이 에러가 발생해요.

출처: Scala 3 Reference

본문

테일 재귀(tail recursion) 최적화를 적용하려면 아래 조건이 모두 갖춰져야 해요.

  • 어노테이션이 붙은 대상이 메서드일 것
  • 메서드가 추상(abstract)이 아닐 것
  • 메서드가 private 또는 final일 것 (그래야 오버라이드되지 않아요)
  • 메서드가 재귀 호출을 테일 위치(tail position)에 둘 것

예시

import scala.annotation.tailrec

class Example:
  @tailrec def factorial(n: Int, acc: Int = 1): Int =
    if n <= 1 then acc
    else factorial(n - 1, n * acc)

에러 메시지

-- [E097] Syntax Error: example.scala:4:15 -------------------------------------
4 |  @tailrec def factorial(n: Int, acc: Int = 1): Int =
  |               ^
  |TailRec optimisation not applicable, method factorial is neither private nor final so can be overridden

해결 방법

메서드를 final이나 private으로 만들어서 오버라이드될 수 없게 하면 돼요.

// Make the method final or private
import scala.annotation.tailrec

class Example:
  @tailrec final def factorial(n: Int, acc: Int = 1): Int =
    if n <= 1 then acc
    else factorial(n - 1, n * acc)
// Or use private
import scala.annotation.tailrec

class Example:
  @tailrec private def factorial(n: Int, acc: Int = 1): Int =
    if n <= 1 then acc
    else factorial(n - 1, n * acc)

더 알아보기

  • @tailrec 어노테이션과 테일 재귀에 대한 더 자세한 내용은 Scala 표준 라이브러리의 scala.annotation.tailrec 문서를 참고해요.