🍎 Kotlin에서 제공하는 `reified`, `inline` 키워드의 기능을 정리합니다. 키워드들이 무엇인지, 그리고 어떤 상황에서 사용되는지 알아보겠습니다.
🍎 `reified`와 `inline`의 사전적 의미
- `reified`는 reify의 과거형으로 사전적 의미로 "개념이나 아이디어를 구체적이고 실질적인 형태로 변환하다"라는 의미를 갖습니다.
- `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
'Dev' 카테고리의 다른 글
[설계] 순서 결정의 책임을 결정하는 방법 (0) | 2024.09.03 |
---|---|
[설계] 설계 시 우선되어야 할 계층 구조에 대하여 (0) | 2024.09.03 |
[Kotlin] Any, *, Generic의 공통점과 차이점 (0) | 2024.09.01 |
General한 Cache 적용 위치 (0) | 2024.09.01 |
REST API 설계 및 사용 시 참고 사항 (1) | 2024.09.01 |