E162: 인라인 코드 안에 case class를 정의할 수 없어요

E162: 인라인 코드 안에 case class를 정의할 수 없어요 (Case Class In Inlined Code)

case class나 case object를 인라인 메서드(inline method)나 quoted 코드 블록 안에 정의할 때 발생하는 에러예요.

출처: Scala 3 Reference

본문

case class 정의는 상당한 양의 바이트코드를 만들어 내요(apply, unapply, copy, equals, hashCode, toString과 그 외 메서드들). 이런 정의를 인라인하게 되면 모든 호출 지점에서 그 바이트코드 크기가 곱해져서 과도한 코드 비대(code bloat)가 발생해요.

Example

inline def example = {
  case class Data(x: Int)
  Data(42)
}

Error

-- [E162] Syntax Error: example.scala:2:13 -------------------------------------
2 |  case class Data(x: Int)
  |  ^^^^^^^^^^^^^^^^^^^^^^^
  |Case class definitions are not allowed in inline methods or quoted code. Use a normal class instead.
  |-----------------------------------------------------------------------------
  | Explanation (enabled by `-explain`)
  |- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
  | Case class/object definitions generate a considerable footprint in code size.
  | Inlining such definition would multiply this footprint for each call site.
   -----------------------------------------------------------------------------

Solution

// Define case class outside the inline method
case class Data(x: Int)

inline def example = Data(42)
// Or use a regular class inside the inline method
inline def example = {
  class Data(val x: Int)
  new Data(42)
}

더 알아보기

  • inline 메서드와 quoted 코드에 대한 자세한 내용은 Scala 3 Reference의 inline 문서를 참고하세요.