값 클래스는 abstract일 수 없어요

값 클래스는 abstract일 수 없어요 (E074: Value Classes May Not Be Abstract)

값 클래스에 abstract 수식어를 붙이면 이 에러가 나요. 값 클래스는 컴파일러가 인라인 처리하기 위해 반드시 구체(concrete)여야 해요.

출처: Scala 3 Reference

본문

값 클래스(AnyVal을 상속하는 클래스)를 abstract로 선언하면 이 에러가 발생해요.

값 클래스는 컴파일러가 인라인 처리하도록 만들어진 타입이라 반드시 구체적이어야 해요. 추상 값 클래스는 인스턴스화할 수 없으니, 객체 할당을 피하겠다는 값 클래스의 본래 목적을 달성할 수가 없죠.

예시 (Example)

abstract class Wrapper(val value: Int) extends AnyVal

에러 (Error)

-- [E074] Syntax Error: example.scala:1:15 -------------------------------------
1 |abstract class Wrapper(val value: Int) extends AnyVal
  |               ^
  |               Value classes may not be abstract

해결 방법 (Solution)

abstract 수식어를 빼면 돼요.

// Remove the abstract modifier
class Wrapper(val value: Int) extends AnyVal

추상화가 필요하다면 값 클래스 대신 유니버설 트레이트(universal trait)를 쓰는 방법이 있어요.

// For abstraction, use a universal trait
trait Numeric extends Any:
  def value: Int

class Wrapper(val value: Int) extends AnyVal with Numeric