[Kotlin] inline함수와 noinline함수

Jinny·2021년 1월 26일
1

Kotlin

목록 보기
5/9
post-thumbnail

코틀린에는 일반 함수 외에도 다양한 형태의 함수가 있다.
오늘은 그 중 인라인 함수에 대해서 공부한다!

🚩 inline 함수

◾ 인라인 함수란?

이 함수를 호출하는 경우 함수의 내용을 모두 복사하여 호출한 부분에 붙여 넣는다.

코드 전체가 복사되어 붙여지기 때문에 되도록 코드를 짧게 작성해야한다.
또한, 람다식 매개변수를 가지고 있는 함수에서 동작한다.

◾ 사용법

// 일반적인 함수 호출
fun main() {
	hello()
    	...
     	hello()
 }
 fun hello(...) {
 	println("hello~")
 }
        
// 인라인 함수 사용
fun main() {
	hello()
    	...
     	hello()
}

inline fun hello(...) {
	println("hello~")
}    

위와 같이 일반 함수 이름 앞에 inline 키워드를 사용하면 된다.

◾ 일반 함수 호출과의 차이점

우선 보통 함수의 경우 호출 시 다른 코드로 분기하기 때문에 저장 / 복구 작업으로 인해 CPU(프로세스)와 메모리를 꽤 사용해야 한다.
함수가 호출될 때 마다 분기 하기 때문에, '일반적인 함수 호출'의 경우 2번 분기 된다.
하지만, 인라인 함수의 경우 내용이 복사되어 main() 코드에 들어가기 때문에 분기가 없다.

즉, 인라인 함수는 함수 호출 시 매번 분기하지 않아도 된다.

실제로 분기가 되지 않는지 역컴파일을 통해 확인 할 수 있다.

** [ intelliJ에서 코틀린 역컴파일 방법 ] Tools > Kotlin > Show Kotlin Bytecode > Decomplie

다음은 '인라인 함수 사용' 코드를 역 컴파일한 결과이다.

결과에서 확인 할 수 있듯이 hello() 내의 코드가 main()으로 2번 복사 된 것을 확인 할 수 있다.

🚩 noinline 함수

인라인 함수의 매개변수로 람다식을 사용할때 일부 람다식을 인라인 되지 않게 하는 방법이 있다.
바로 noline 키워드를 사용하는 것이다.

fun main() {
   hello(3) { println("hello~ $it")}
}

inline fun hello(x:Int, noinline y:(Int) -> Unit) { //noinline 키워드 사용
    y(x)
}

noinline 키워드를 사용한 람다식은 hello() 호출시 인라인으로 처리되지 않고, 분기 처리된다.
위코드를 역컴파일 해보면 다음과 같이 main안에 그대로 복사 되지 않음을 알수 있다.

noinline 함수는 소수의 람다식만 인라인 함수로 사용하고자 할 때 사용한다.


출처 : 코틀린 공식문서 & Do it! 코틀린 프로그래밍
profile
신입 개발자👩‍💻

0개의 댓글