계발자 블로그

[Kotlin] inline 함수, reified 본문

Kotlin

[Kotlin] inline 함수, reified

더구더구 2023. 6. 5. 16:44

inline 함수

코틀린에서 인라인 함수(inline function)은 함수 호출 시

해당 함수의 본문이 호출 위치에 "인라인"되어 실행되도록 하는 특별한 종류의 함수입니다.

인라인 함수는 함수 호출로 인한 오버헤드를 줄이고 성능을 최적화하는 데 도움이 됩니다.

 

일반적으로 함수 호출은 호출 지점에서 호출되는 함수로 이동하고,

해당 함수가 실행을 마친 후에 호출 지점으로 다시 돌아와야 합니다.

이러한 과정은 함수 호출을 위해 스택에 프레임을 추가하고 제거하는 작업을 수반하며, 성능에 영향을 줄 수 있습니다.

 

인라인 함수는 이러한 함수 호출 오버헤드를 제거하기 위해

컴파일러에게 해당 함수의 본문을 호출 지점에 직접 복사하도록 요청합니다.

이렇게 하면 함수 호출이 발생하지 않고 호출 지점에 함수의 본문이 인라인 되므로 오버헤드가 없어집니다.

 

쉽게 말해 호출 위치에 "인라인" 된다는 것은 인라인 함수 안에 있는 코드들이 호출 위치에 그대로 복사되어 실행된다는 뜻입니다.

 

함수 호출 방식은 전체 코드 양이 줄어들어 메모리를 적게 쓴다는 장점이 있지만

호출 시 코드 흐름이 이동하고 다시 돌아와야 하기 때문에 작업량이 늘어납니다.

 

인라인 함수는 전체 코드 양이 늘어 메모리를 더 많이 사용하지만 코드 흐름의

이동 없이 수행되기 때문에 작업량이 늘어나지 않습니다.

 

 

인라인 함수를 선언하려면 함수 선언 앞에 inline 키워드를 사용하면 됩니다.

inline fun calculateSum(a: Int, b: Int): Int {
    return a + b
}

인라인 함수는 갔다가 돌아오는 작업을 하지 않기 때문에 미세한 성능차이를 볼 수 있습니다.

사실 일반적인 소프트웨어 개발 시 사람이 미세한 차이를 느낄 수 없지만

 

게임 같이 성능이 중요한 개발 시에는 메모리를 많이 사용해도

성능이 중요하기 때문에 인라인 함수를 사용하면 약간의 성능 이득을 가질 수 있는 장점이 있습니다.

 


reified

reified는 코틀린에만 있는 특별한 키워드입니다.

 

reified 키워드는 제네릭 타입 매개변수를 실체화된 타입으로 사용할 수 있게 해줍니다. 일반적으로 제네릭 타입 매개변수는 컴파일 시간에만 알려지는 타입으로 처리되기 때문에, 타입에 관련된 정보를 사용하는 작업을 할 수 없습니다.

 

하지만 reified 키워드를 사용하면 런타임 시에 제네릭 타입 매개변수의 타입 정보를 알 수 있습니다. 이를 통해 제네릭 타입 매개변수로부터 실체화된 타입을 얻어와서 타입 검사나 리플렉션 등의 작업을 수행할 수 있습니다.

 

reified 키워드는 inline 함수 내에서만 사용할 수 있습니다.

fun <T> doSomething(someValue: T, Class<T> type) { 
    // T의 타입을 파라미터를 통해 알기에 OK
    println("Doing something with value: $someValue")  
    
    // T::class 가 어떤 class인지 몰라서 Error
    println("Doing something with type: ${T::class.simpleName}") 
}
//reified로 런타임시 T의 타입을 유추 할 수있게됨
inline fun <reified T> doSomething(someValue: T) {
  // OK
  println("Doing something with value: $someValue")    
  
  // T::class 가 reified로 인해 타입을 알 수 있게되어 OK
  println("Doing something with type: ${T::class.simpleName}")    
}

 

 

 

출처 :

윤재성의 google 공식 언어 kotlin 프로그래밍 시작하기

https://velog.io/@miot2j/Kotlin-Inline-Funtions-과-Reified-사용-이유

 

 

'Kotlin' 카테고리의 다른 글

[Coroutine] Flow  (1) 2024.04.25
[Kotlin] 추상 클래스 와 인터페이스  (0) 2023.07.16
[Kotlin] Null 처리  (0) 2023.03.14
[Kotlin] 코틀린 Companion Object  (0) 2023.03.01
[Kotlin] Kotlin Property (코틀린 프로퍼티)  (0) 2023.03.01