코틀린 inline
코틀린에선 고차 함수를 사용할 수 있다.
함수를 인자 혹은 반환값으로 사용할 경우 내부적인 동작에서 무의미한 객체/함수를 생성하여 메모리를 낭비시키고 성능 저하를 일으킬 수 있다.
이러한 무의미한 행위를 줄이기 위해 inline 키워드가 제공되는데, 해당 키워드를 사용할 경우 고차 함수 내부의 코드가 그대로 복사되므로 위에서 말한 페널티를 줄일 수 있다.
원본 코드
fun main(){
val someText = foo("main"){
println("in")
}
}
fun foo(value: String, doSomeThing: () -> Unit): String{
doSomeThing()
return value + "foo()"
}
인라인이 아닐경우 (Java 변환)
public static final void main() {
String someText = foo("main", (Function0)null.INSTANCE);
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
@NotNull
public static final String foo(@NotNull String value, @NotNull Function0 doSomeThing) {
Intrinsics.checkNotNullParameter(value, "value");
Intrinsics.checkNotNullParameter(doSomeThing, "doSomeThing");
doSomeThing.invoke();
return value + "foo";
}
인라인일 경우 (Java 변환)
public static final void main() {
String value$iv = "main";
int $i$f$foo = false;
int var3 = false;
String var4 = "in";
boolean var5 = false;
System.out.println(var4);
String someText = value$iv + "foo()";
}
// $FF: synthetic method
public static void main(String[] var0) {
main();
}
@NotNull
public static final String foo(@NotNull String value, @NotNull Function0 doSomeThing) {
int $i$f$foo = 0;
Intrinsics.checkNotNullParameter(value, "value");
Intrinsics.checkNotNullParameter(doSomeThing, "doSomeThing");
doSomeThing.invoke();
return value + "foo()";
}
하지만 인자로 전달 받은 함수를 또 다른 함수의 인자로 전달하는 경우 컴파일 에러가 발생하게 된다.
이를 해결하기 위해 noinline 키워드가 제공되는데, noinline 키워드가 추가된 함수 타입의 인자를 전달하면 해당 함수는 기존의 방식대로 새롭게 생성되어 호출된다.
fun main(){
val someText = foo1("main"){
println("in")
}
}
inline fun foo1(value: String, noinline doSomeThing1: () -> Unit){
doSomeThing1()
foo2(value, doSomeThing1)
}
fun foo2(value: String, doSomeThing2: () -> Unit): String{
doSomeThing2()
return value + "foo()"
}
'Kotlin' 카테고리의 다른 글
[Kotlin] 코틀린에서 RxJava와 Coroutine (0) | 2022.01.06 |
---|---|
[Kotlin] Coroutine 동기화 처리 (0) | 2021.12.21 |
[Kotlin] Flow (0) | 2021.08.13 |
[Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교 (0) | 2021.08.04 |
[Kotlin] 커링(Currying) 함수 (0) | 2021.08.03 |