ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Kotlin Value Class란?
    Kotlin 2023. 9. 1. 00:01
    728x90

    개요

    코틀린에서는 VO(Value Object)를 어떻게 만드는지 알아보다가 Value Class에 대해 알게 되었습니다.

    VO란 특정한 비즈니스값을 담는 객체라고 합니다.

    Kotlin 1.5에 출시된 기능입니다.

     

    Kotlin의 Value Class란?

    비즈니스 로직에서 특정 type에 대한 wrapper class를 생성해야 하는 경우가 있을 수 있습니다.

    하지만 추가적인 heap alloation으로 런타임이 오버헤드가 발생하게 됩니다.

    특히 래핑 된 타입이 원시타입(primitive type)인 경우에는 런타임에 크게 최적화되는데 이런 장점을 누리지 못합니다.

     

    이런 문제를 해결하기 위해 kotlin에서는 inline class를 소개합니다.

    value class Password(private val s: String)

    다음과 같이 value라는 키워드를 클래스 앞에 붙여줍니다.

     

    // For JVM backends
    @JvmInline
    value class Password(private val s: String)

    만약 JVM backend에서 사용하고 싶다면 @Jvminline 어노테이션도 같이 붙여주어야 합니다.

     

     

    최적화는 어떻게 진행될까?

    JVM이 바이트코드로 컴파일하는 과정에서 객체를 제거하고 value class의 프로퍼티로 대체합니다.

    Password를 사용하는 부분에서 Password 객체를 사용하지 않고 String을 사용하는 것처럼 컴파일됩니다.

     

    최적화 시에 발생할 수 있는 문제

    @JvmInline
    value class UInt(val x: Int)
    
    // 기본타입을 가지는 compute 함수
    fun compute(x: Int) { }
    
    // value class를 타입으로 가지는 compute 함수
    fun compute(x: UInt) { }

    예를 들어 UInt라는 value class가 컴파일하게 되면 기본타입을 가지는 compute 함수와 충돌될 수 있습니다.

    이때 mangling이라는 기법을 활용하여 함수 이름에 안정된 해시코드를 추가하여 이런 충돌 문제를 해결합니다.

     

    데이터 클래스와는 어떻게 다를까?

    value 클래스의 특징은 다음과 같습니다.

    • value class는 equals, toString, hashCode만 자동 생성합니다.
    • === 연산을 컴파일 단계에서 금지합니다.
    • 반드시 val 프로퍼티만 허용합니다.
    • 하나의 프로퍼티만 사용할 수 있습니다.
    • backing property를 가질 수 없습니다.
    • lateinit 필드를 가질 수 없습니다.

     

    inline class와는 어떻게 다를까?

    value class와 inline class는 동일합니다, value class는 inline class의 구현체라고 볼 수 있습니다.

    inline이라는 의미에 집중하면 개발자는 클래스를 박스화하지 않으려는 것입니다.

    하지만 Kotlin은 시스템 프로그래밍 언어가 아니고, 성능은 주요한 요소이지만 순수하게 성능 지향적인 모델을 갖지 않는 곳에 옳지 않으며 inline function이 별도로 존재하며 키워드가 동일하지만 내부 컨셉은 다르기 때문에 혼란이 야기되고 value class로 변경되었습니다.

     

    혼란을 야기할 수 있는 예시를 한 가지 들자면 inline class에서 사용하는 함수는 inline이 아닙니다.

     

     

     

     

     

    참고자료

    https://kotlinlang.org/docs/inline-classes.html

    https://github.com/Kotlin/KEEP/blob/master/notes/value-classes.md

     

    'Kotlin' 카테고리의 다른 글

    상태패턴과 전략패턴의 차이는 무엇일까?  (1) 2023.10.17
    Mapstrcut 변환시 함수 호출하기  (0) 2023.05.22
    Kotlin으로 Jwt 개발하기  (0) 2023.05.14

    댓글

Designed by Tistory.