inline class (Kotlin 1.5부터는 value class)는 실행 중에 별도의 객체를 생성하지 않고 원시 타입에 대한 래퍼를 생성할 수 있게 합니다. 이는 메모리 할당의 오버헤드 없이 타입 안전성을 높이는 데 사용됩니다. 내부적으로 이러한 객체는 해당 원시 타입으로 컴파일될 수 있습니다.
예시:
@JvmInline value class UserId(val id: String) fun printUserId(userId: UserId) { println(userId.id) }
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와 문자열 간의 명시적 매핑을 통해 문제를 해결했습니다.