• 목록 (128)
    • Android (62)
    • Back-End (2)
    • Java (3)
    • Kotlin (16)
    • CS (7)
    • 개발 서적 (12)
    • 문제 풀이 (26)

최근 글

티스토리

전체 방문자
오늘
어제
hELLO · Designed By 정상우.
MJ_94
Kotlin

[Kotlin] inline 함수

[Kotlin] inline 함수
Kotlin

[Kotlin] inline 함수

2021. 9. 6. 16:28

코틀린 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
  • 코틀린 inline
'Kotlin' 카테고리의 다른 글
  • [Kotlin] 코틀린에서 RxJava와 Coroutine
  • [Kotlin] Coroutine 동기화 처리
  • [Kotlin] Flow
  • [Kotlin] 리스트를 통한 명령형 방식과 함수형 방식 비교
MJ_94
MJ_94
안드로이드, 개발 관련 기술 블로그

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.