[kotlin] value class에 대하여

왕왕조현·2026년 3월 8일

kotlin

목록 보기
1/2
post-thumbnail

안녕하세요!

코틀린에 대해 깊이 파해치고자 하는 개발자 꿈나무 김조현입니다.

이번 글에서는 kotlin의 value class에 대해 정리해보겠습니다.

value class는 무엇인가?

값을 클래스로 감싸 도메인 특화 타입을 만드는 것이 유용할 수 있지만, 이로 인해 추가적인 힙 메모리 할당으로 인한 런타임 오버헤드가 발생합니다. 더욱이 감싸는 타입이 기본형인 경우 성능 저하가 심각한데, 이는 기본형 타입은 런타임에 의해 집중적으로 최적화되는 반면, 감싸는 타입은 특별한 처리를 받지 못하기 때문입니다.

이런 문제를 해결하기 위해 value class가 등장한 것입니다. value class는 코틀린에서 지원하는 단 하나의 프로터피를 감싸는 클래스입니다.

어떻게 사용하는가?

클래스 앞에 value 키워드를 붙이면 사용할 수 있습니다.

value class Password(private val s: String)

인라인 클래스는 기본 생성자에서 초기화되는 단일 속성을 가져야 합니다.

@JvmInline
value class Title(val content: String) {
    init {
        require(content.isNotBlank()) { throw IllegalArgumentException("[ERROR] 제목의 내용이 존재해야 합니다.") }
    }
}

value class를 JVM 백엔드에서 사용하기 위해서는 @JvmInline 어노테이션을 작성해야 합니다.

value class의 특징은?

일반 클래스처럼 속성함수를 선언할 수 있으며, init 블록보조 생성자를 가질 수 있습니다.

@JvmInline
value class Person(private val fullName: String) {
    init {
        require(fullName.isNotEmpty()) {
            "Full name shouldn't be empty"
        }
    }

    constructor(firstName: String, lastName: String) : this("$firstName $lastName") {
        require(lastName.isNotBlank()) {
            "Last name shouldn't be empty"
        }
    }

    val length: Int
        get() = fullName.length

    fun greet() {
        println("Hello, $fullName")
    }
}

fun main() {
    val name1 = Person("Kotlin", "Mascot")
    val name2 = Person("Kodee")
    name1.greet() // the `greet()` function is called as a static method
    println(name2.length) // property getter is called as a static method
}

하지만 backing field를 가질 수 없으며, lateinit 프로퍼티 를 사용하지 않습니다.

인터페이스 상속은 가능하지만 다른 클래스를 상속할 수 없으며 항상 final입니다.

data class와는 무엇이 다른가?

value class는 val만 허용하며, 이도 하나만 사용하도록 제한됩니다. 반면 data class는 val, var 모두 사용이 가능합니다.

data class는 데이터 관리를 위해 equals, toString, hashCode, copy, componentN 등을 자동으로 생성해주지만, value class는 equalshashCode만을 자동으로 생성합니다.

즉, data class는 데이터 보관 및 관리에 초점을 두어 여러 데이터를 관리하거나 비교할 때 주로 사용하고, value class는 래핑을 사용한 성능 최적화를 초점으로 두기 때문에 기본 타입 하나를 감싸 성능 최적화를 하고싶을 때 주로 사용합니다.

참고자료

Inline value classes[코틀린 공식 문서]

profile
천천히, 꾸준히, 한 걸음씩

0개의 댓글