값 클래스는 다른 값 클래스를 감쌀 수 없어요

값 클래스는 다른 값 클래스를 감쌀 수 없어요 (E076: Value Classes May Not Wrap Another Value Class)

값 클래스의 파라미터 타입이 또 다른 사용자 정의 값 클래스면 이 에러가 나요. 값 클래스는 다른 사용자 정의 값 클래스를 감쌀 수 없어요.

출처: Scala 3 Reference

본문

값 클래스(AnyVal을 상속하는 클래스)의 파라미터 타입이 또 다른 사용자 정의 값 클래스일 때 이 에러가 발생해요.

값 클래스는 다른 사용자 정의 값 클래스를 감쌀 수 없어요. 그렇게 되면 JVM에서 값 클래스를 표현하고 최적화하는 과정이 복잡해지거든요.

예시 (Example)

class Meters(val value: Double) extends AnyVal
class Distance(val meters: Meters) extends AnyVal

Distance의 파라미터 meters가 값 클래스 Meters 타입이네요.

에러 (Error)

-- [E076] Syntax Error: example.scala:2:6 --------------------------------------
2 |class Distance(val meters: Meters) extends AnyVal
  |      ^
  |      A value class may not wrap another user-defined value class

해결 방법 (Solution)

안쪽 값 클래스가 감싸고 있던 원시 타입(primitive type)을 바깥 값 클래스도 직접 감싸면 돼요.

// Wrap the underlying primitive type directly
class Meters(val value: Double) extends AnyVal
class Distance(val value: Double) extends AnyVal

object Distance:
  def fromMeters(m: Meters): Distance = new Distance(m.value)

바깥 래퍼(wrapper)가 변환 로직을 담아야 한다면 일반 클래스를 쓰는 것도 방법이에요.

// Or use a regular class for the outer wrapper
class Meters(val value: Double) extends AnyVal
class Distance(val meters: Meters)