값 클래스는 초기화 문을 가질 수 없어요
값 클래스는 초기화 문을 가질 수 없어요 (E073: Value Classes May Not Contain Initialization)
값 클래스(AnyVal을 상속하는 클래스)의 몸통에 초기화 문을 넣으면 컴파일러가 이 에러를 보여줘요. 값 클래스는 인라인 처리를 전제로 하는 타입이라, 초기화 코드가 어울리지 않아요.
본문
값 클래스(자바의 원시 타입을 감싸도록 AnyVal을 상속하는 클래스)의 몸통(body)에 초기화 문(initialization statement)이 들어 있으면 이 에러가 발생해요.
값 클래스는 컴파일러가 완전히 인라인 처리하도록 설계된 타입이라 초기화 문을 가질 수 없어요. 초기화 코드가 조금이라도 있으면 이 최적화를 막게 되죠.
예시 (Example)
class Wrapper(val value: Int) extends AnyVal:
println(s"Created wrapper with $value")
생성 시점에 실행되는 println 초기화 문이 값 클래스 몸통에 들어가 있네요. 이 부분이 문제가 돼요.
에러 (Error)
-- [E073] Syntax Error: example.scala:2:9 --------------------------------------
2 | println(s"Created wrapper with $value")
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
| Value classes may not contain initialization statements
해결 방법 (Solution)
가장 간단한 방법은 몸통에서 초기화 문을 빼는 거예요.
// Remove initialization statements
class Wrapper(val value: Int) extends AnyVal:
def show: String = s"Wrapper($value)"
생성 로직에 부수 효과가 필요하다면 컴패니언 객체(companion object)로 팩토리 로직을 옮길 수도 있어요.
// Or use a companion object for factory logic
class Wrapper(val value: Int) extends AnyVal
object Wrapper:
def create(value: Int): Wrapper =
println(s"Creating wrapper with $value")
new Wrapper(value)
초기화가 꼭 필요하다면 애초에 값 클래스 대신 일반 클래스를 쓰는 게 맞아요.
// Or use a regular class if you need initialization
class Wrapper(val value: Int):
println(s"Created wrapper with $value")