값 클래스는 다른 클래스 안에 정의할 수 없어요
값 클래스는 다른 클래스 안에 정의할 수 없어요 (E075: Value Classes May Not Be Contained)
값 클래스를 메서드 안의 로컬 클래스로, 또는 다른 클래스의 멤버로 정의하면 이 에러가 나요. 값 클래스는 반드시 최상위(top-level) 클래스나 객체(object)의 멤버여야 해요.
본문
값 클래스(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)