Programming Language/Kotlin

[Kotlin] Inline class란

Tenacity_Dev 2023. 1. 1. 15:04
728x90

인라인 클래스란?

경우에 따라 비즈니스 논리가 일부 형식 주위에 래퍼를 만드는 것이 필요하다.

그러나 추가 힙 할당으로 인해 런타임 오버헤드가 발생하고 또한 래핑된 유형이 기본 유형인 경우 기본 유형은 일반적으로 런타임에 의해 크게 최적화되는 반면 해당 래퍼는 특별한 처리를 받지 않기 때문에 성능 저하가 발생한다.

 

이러한 문제를 해결하기 위해서 Kotlin에서는 inline class를 제공한다.

인라인 클래스는 value-based classes의 하위 집합입니다. 이는 정체성은 존재하지 않으며 값만을 보유합니다.

inline class는 생성자로 단 하나의 값만 받을 수 있다. 물론 클래스내에 프로퍼티와 함수를 정의할 수도 있다.

inline class UserName(val value: String)
inline class Password(val value: String) {
	fun isValid() = value.isNotEmpty()
}

Inline classes vs Type aliases

Inline class와 Type aliase는 타입에 대해 새로운 이름을 부여하고, 런타임에 원래 타입으로 사용된다는 공통점이 있다.

그러나 차이는 존재한다. type aliase는 기존 타입과 Aliase 타입의 호환성이 보장되는 반면 Inline class는 기존 타입과 Inline class를 명확히 구분짓기 때문에 호환되지 않는다. 즉 inline class는 완전히 새로운 type을 만드는 거라고 볼 수 있고, type aliase는 그저 원래 있던 타입에 별칭을 붙여주는 것 뿐이다.

typealias NameTypeAlias = String
inline class NameInlineClass(val s: String)

fun acceptString(s: String) {}
fun acceptNameTypeAlias(n: NameTypeAlias) {}
fun acceptNameInlineClass(p: NameInlineClass) {}

fun main() {
    val nameAlias: NameTypeAlias = ""
    val nameInlineClass: NameInlineClass = NameInlineClass("")
    val string: String = ""

    acceptString(nameAlias) // OK: alias 타입을 기존 타입에 넘겨주어도 된다.
    acceptString(nameInlineClass) // Not OK: Inline class를 String타입으로 넣을 수 없다. NameInlineClass 타입은 String타입이 아니기 때문.

    // And vice versa:
    acceptNameTypeAlias(string) // OK: String타입을 Alias타입으로 넣어도 된다. NameTypeAlias는 단지 String의 다른 이름일 뿐이기 때문이다.
    acceptNameInlineClass(string) // Not OK: String과 NameInlineClass는 다른 타입이기 때문에 불가능하다.
}

 

참고 : 

https://wooooooak.github.io/kotlin/2021/01/03/inline_class/

 

Kotlin Inline class · 쾌락코딩

Kotlin Inline class 03 Jan 2021 | inline_class 비즈니스 로직을 작성하다 보면 어떤 타입의 Wrapper를 작성할 때가 있다. 예를 들어 userName을 표현할 때 단순히 String으로 나타낼 수 있겠지만, 좀 더 도메인적

wooooooak.github.io

 

728x90