값 클래스는 다른 클래스 안에 정의할 수 없어요

값 클래스는 다른 클래스 안에 정의할 수 없어요 (E075: Value Classes May Not Be Contained)

값 클래스를 메서드 안의 로컬 클래스로, 또는 다른 클래스의 멤버로 정의하면 이 에러가 나요. 값 클래스는 반드시 최상위(top-level) 클래스나 객체(object)의 멤버여야 해요.

출처: Scala 3 Reference

본문

값 클래스(AnyVal을 상속하는 클래스)를 로컬 클래스(local class)나 다른 클래스의 멤버로 정의하면 이 에러가 발생해요.

값 클래스는 최상위 클래스이거나 객체의 멤버여야 해요. 메서드 안에 정의되는 로컬 클래스나 다른 클래스 안의 멤버 클래스는 될 수 없어요. 최적화를 하려면 값 클래스가 컴파일 시점에 완전히 결정되어야 하기 때문이죠.

예시 (Example)

class Outer:
  class Wrapper(val value: Int) extends AnyVal

값 클래스 Wrapper를 다른 클래스 Outer의 멤버로 정의했네요.

에러 (Error)

-- [E075] Syntax Error: example.scala:2:8 --------------------------------------
2 |  class Wrapper(val value: Int) extends AnyVal
  |        ^
  |        Value classes may not be a member of another class

해결 방법 (Solution)

값 클래스를 최상위에 정의해요.

// Define the value class at the top level
class Wrapper(val value: Int) extends AnyVal

class Outer:
  def wrap(x: Int): Wrapper = new Wrapper(x)

또는 객체 안에 정의하는 방법도 있어요.

// Or define it inside an object
object Types:
  class Wrapper(val value: Int) extends AnyVal

class Outer:
  def wrap(x: Int): Types.Wrapper = new Types.Wrapper(x)