프로그래밍백엔드 개발자

Kotlin에서 'inline class' (value class)란 무엇인가요? 이들은 왜 필요하며, 올바르게 사용하는 방법, 이러한 클래스의 제한 사항 및 특징은 무엇인가요? 코드 예시를 들어 주세요.

Hintsage AI 어시스턴트로 면접 통과

답변

inline class (Kotlin 1.5부터는 value class)는 실행 중에 별도의 객체를 생성하지 않고 원시 타입에 대한 래퍼를 생성할 수 있게 합니다. 이는 메모리 할당의 오버헤드 없이 타입 안전성을 높이는 데 사용됩니다. 내부적으로 이러한 객체는 해당 원시 타입으로 컴파일될 수 있습니다.

예시:

@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
  • 하나의 속성(기본 필드)만 허용됩니다.
  • 매개변수가 없는 생성자는 불가능합니다.
  • 클래스는 상태를 포함할 수 없으며(예: var 필드), 오직 val만 가능합니다.
  • 다른 클래스를 상속할 수 없지만, 인터페이스를 구현할 수 있습니다.
  • Java 코드와의 상호작용이 명확하지 않을 수 있으며, boxing/unboxing이 일어날 수 있습니다.

inline/value 클래스를 사용하는 것은 식별자, 돈, 측정 단위 등을 타입화하는 데 중요합니다.

함정 질문

value class는 여러 속성을 가질 수 있나요?

답변: 아니요. Value class는 기본 생성자에 하나의 속성만 포함할 수 있습니다.

오류 코드 예시:

@JvmInline value class Money(val amount: Int, val currency: String) // 컴파일 오류

주제에 대한 지식 부족으로 인한 실제 오류 사례


이야기

환전소에서 inline class를 사용하여 금액과 통화를 설명했습니다. value class에 두 개의 필드를 추가하려고 했고, 컴파일 오류가 발생하여 제한을 우회하려고 시간을 낭비했습니다. 결국 별도의 data class를 만들기로 결정했습니다.


이야기

외부 Java 라이브러리와의 통합 시 inline class가 객체로 변환(boxing)되어 성능에 영향을 미쳤습니다. 문서를 분석한 후 일반 value object로 교체했습니다.


이야기

마이크로서비스 프로젝트에서 API의 id로 value class를 사용했습니다. 한 서비스는 문자열을 직접 반환하고, 다른 서비스는 value class를 반환하여 Jackson과의 직렬화 충돌이 발생했습니다. id와 문자열 간의 명시적 매핑을 통해 문제를 해결했습니다.