E126: Value Class Parameter May Not Be Call-By-Name — 값 클래스 파라미터는 값 호출이어야 해요

E126: Value Class Parameter May Not Be Call-By-Name — 값 클래스 파라미터는 값 호출이어야 해요

값 클래스(AnyVal을 상속하는 클래스)에 이름으로 호출되는(=> T 문법) 파라미터가 있을 때 발생하는 에러예요.

출처: Scala 3 Reference

본문

값 클래스(AnyVal을 상속하는 클래스)에 이름으로 호출되는 파라미터(=> T 문법)가 있을 때 발생해요.

값 클래스는 런타임 할당 오버헤드를 피할 수 있게 해주는 특별한 래퍼(wrapper) 메커니즘이에요. JVM은 값 클래스의 인스턴스를 런타임에 그 기반이 되는 값으로 표현하거든요. 반면 이름으로 호출되는 파라미터는 접근할 때마다 지연 평가되는 방식이라, 프리미티브 값으로 언박싱할 수 없어서 이 최적화와는 맞지 않아요.

예시

class Wrapper(x: => Int) extends AnyVal

에러

-- [E126] Syntax Error: example.scala:1:14 -------------------------------------
1 |class Wrapper(x: => Int) extends AnyVal
  |              ^
  |              Value class parameter `x` may not be call-by-name

해결 방법

일반적인(값으로 호출되는) 파라미터를 쓰면 돼요.

// Use a regular (by-value) parameter
class Wrapper(val x: Int) extends AnyVal

지연 평가가 꼭 필요하다면, 일반 클래스를 사용하는 걸 고려해볼게요.

// Alternative: If lazy evaluation is needed, consider using a regular class
class Wrapper(x: => Int):
  def value: Int = x