이 글은 기존 운영했던 WordPress 블로그인 PyxisPub: Development Life (pyxispub.uzuki.live) 에서 가져온 글 입니다. 모든 글을 가져오지는 않으며, 작성 시점과 현재 시점에는 차이가 많이 존재합니다.
작성 시점: 2017-07-11
Inline Functions는 단순히 성능 향상(정확히는 성능 임팩트 최소화) 뿐만이 아니라 Local Return 문에도 사용하다.
간단히 아래 코드를 보자.
fun init() {
val numbers = 1..100
numbers.myLambda({
if (it % 5 == 0) {
return@myLambda
}
})
println("Hello!")
}
fun <T> Iterable<T>.myLambda(action: (T) -> Unit) {
for (elements in this) action(elements)
}
myLambda 란 메소드는 Iterable 의 확장 메소드(Extension methods) 로 리스트의 각 요소마다 action 을 실행하는 구조를 가지고 있다. 이 코드를 돌려보면 어떤 결과가 나올까. myLambda 의 원소가 5일 때, 해당 myLambda의 작업은 중지되고 'Hello!' 이 터미널에 찍힐 것이다.
그렇다면, myLambda의 원소가 5일 때 해당 메소드 자체의 작업을 중지시키려면 어떻게 해야할까? 간단히 return@myLambda를 return으로 바꾸면 될까?
'return'은 허용되지 않습니다 란 오류를 호출하며 컴파일이 되지 않는다.
이런 경우에, 해당 myLambda에 inline 키워드를 붙여주면 정상적으로 작동하는데, 바이트 코드를 살펴보면
public final void init() {
IntRange numbers = new IntRange(1, 100);
Iterable $receiver$iv = (Iterable)numbers;
Iterator var4 = $receiver$iv.iterator();
int elements$iv;
do {
if(!var4.hasNext()) {
String var2 = "Hello!";
System.out.println(var2);
return;
}
elements$iv = ((IntIterator)var4).nextInt();
} while(elements$iv % 5 != 0);
}
이런 형태가 되어 최종적으로 Hello! 가 노출되지 않는다.
물론, Anonymous function를 사용하면 위와 같은 문제는 일어나지 않는 것 같다.
numbers.myLambda(fun(elements) {
if (elements % 5 == 0) {
return
}
})