E097: Tailrec Not Applicable
E097: Tailrec Not Applicable (테일 재귀 최적화 적용 불가)
@tailrec 어노테이션을 붙였는데, 정작 테일 재귀 최적화를 적용할 수 없는 메서드에서 이 에러가 발생해요.
본문
테일 재귀(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문서를 참고해요.