Dev

[Kotlin] reified, inline 그리고 Generic

친환경사과 2024. 9. 3. 14:26

🍎 Kotlin에서 제공하는 `reified`, `inline` 키워드의 기능을 정리합니다. 키워드들이 무엇인지, 그리고 어떤 상황에서 사용되는지 알아보겠습니다.


🍎 `reified`와 `inline`의 사전적 의미

출처 : Naver Dictionary

- `reified`는 reify의 과거형으로 사전적 의미로 "개념이나 아이디어를 구체적이고 실질적인 형태로 변환하다"라는 의미를 갖습니다.

출처 : Naver Dictionary

- `inline`은 "줄지어 있는, 일렬로 나란히 있는"을 의미하며 컴퓨터 용어로는 코드를 다른 코드 내에 직접 삽입하는 방식을 의미합니다.


🍏 예를 통한 `refied` 이해 

- `reified`를 알기 위해선 우선 `inline` 키워드를 알아야 합니다.

fun printYourName(operation: () -> Any) {
    println("제 이름은")
    operation()
    println("입니다.")
}

fun main() {
    printYourName {
        println("친환경 사과🍎")
    }
}

<`inline` Keyword 사용 예시>

    Tiny Tip) `inline`을 사용하게 되면 호출되는 곳에 직접 삽입이 되어 사용되기 때문에 함수 스택에 새로운 프렘이으로 쌓이지 않아 오버헤드를 줄일 수 있습니다.

 

❓ `reified`를 설명하고 있는데 `inline`은 왜 등장하며 알아야 하는 것일까요?

- `reified`를 사용하려면 `inline`이 필수적이므로, `inline` 없이 `reified`만 사용하는 것은 불가능하기 때문입니다.

- 일반적으로 `inline`를 사용하게 되면 문제가 발생하지 않습니다. 하지만, `inline`과 `Generic`을 사용할 때, 문제가 발생합니다. 함수 선언 시 `Generic`을 사용하는 시점에서 타입을 명시해줘야 합니다. 명시해주지 않는다면 아래와 같은 Exception이 발생합니다.

fun <T> printClassName(value: T) {
    println(value::class.simpleName) // 컴파일 오류 발생
}

fun main() {
    printClassName("Hello") // 출력: String
    printClassName(123)     // 출력: Int
}

<`inline`과 `reified` 없이 `Generic`을 사용하는 함수의 예시>

 

- 발생하는 원인은 inline 함수를 실행하는 시점에서 타입을 알 수 없기 때문입니다. 즉, 실행 시점에 타입을 알려줄 무엇인가 존재해야 합니다. → 이 것이 `reified` 가 수행하는 기능입니다.

- 일반적인 `Generic`에선 컴파일러가 타입 정보를 컴파일 시간에만 알고 있습니다. 즉, 컴파일러는 타입 소거(type erasure)를 수행하여 컴파일된 코드에서 제네릭 타입 정보를 제거합니다. 따라서 런타임에는 제네릭 타입 정보를 사용할 수 없습니다.

 

❓그래서 `reified`는 어떤 기능을 제공하나요?

- `reified` 제네릭 타입의 타입 정보를 런타임에 사용하기 위해 사용됩니다.

- reified를 사용하면 이 타입 정보를 런타임에도 활용할 수 있게 됩니다. 이는 타입 캐스팅이나 리플렉션과 같은 작업에서 유용하게 활용될 수 있습니다.


🍎 Reference

https://kotlinlang.org/docs/inline-functions.html#inline-properties

 

Inline functions | Kotlin

 

kotlinlang.org