Kotlin – Inline Functions (2) - Local Return

WindSekirun (wind.seo)·2022년 4월 26일
0
post-custom-banner

이 글은 기존 운영했던 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
            }
 })
profile
Android Developer @kakaobank
post-custom-banner

0개의 댓글