함수가 호출되는 곳에 내용을 모두 복사한다.

함수의 분기 없이 처리가 가능하다. 이는 성능 증가로 직결된다.

fun main() {
		sub() // sub() 함수를 호출한다음 처리하고 돌아온다.
		sub()
}

fun sub(): String = "abc"

호출되는 함수의 수가 많으면 많을수록 분기 오버헤드(프로그램의 실행흐름에서 나타나는 현상중 하나 예를 들어 , 프로그램의 실행흐름 도중에 동떨어진 위치의 코드를 실행시켜야 할 때 , 추가적으로 시간 ,메모리, 자원이 사용되는 현상)가 많아진다.

fun main() {
		~~sub()~~ // -> 본문이 abc로 복사됨
		~~sub()~~ // -> 본문이 abc로 복사됨
}

inline fun sub(): String = "abc"

inline함수는 퍼포먼스에 영향을 주기때문에 함수(람다)타입에 사용하는것이 적합하다 그리고 호출의 빈도수가 높아지면 코드의 사이즈가 커지게된다.

fun main() {
		shortFunc(3) {
				println("it : $it")
		}
}

inline fun shortFunc(a: Int, out: (Int) -> Unit) {
    println("test")
    out(a)
}

위 코드를 바이트 코드를 치환해서 실행시키면

protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.setContentView(1300002);
      int a$iv = 3;
      int $i$f$shortFunc = false;
      String var5 = "test";
      System.out.println(var5);
      int var7 = false;
      String var8 = "it : " + a$iv;
      System.out.println(var8);
   }

   public final void shortFunc(int a, @NotNull Function1 out) {
      int $i$f$shortFunc = 0;
      Intrinsics.checkNotNullParameter(out, "out");
      String var4 = "test";
      System.out.println(var4);
      out.invoke(a); // Function1을 실행시킨다. println("it : $it")
   }

shortFunc의 함수를 호출하는 형식이 아닌 값을 복사해서 가져오는걸 확인할 수 있다.

invoke 는 해당되는 함수로 구성된 인자의 함수를 실행한다.

noninline 키워드

일부 람다식 함수를 인라인 되지 않게 하기 위해 사용된다.

inline fun sub(out1: Int, noinline out2: () -> Unit)
protected void onCreate(@Nullable Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      this.setContentView(1300002);
      byte a$iv = 3;
      Function1 out$iv = (Function1)null.INSTANCE;
      int $i$f$shortFunc = false;
      String var6 = "test";
      System.out.println(var6);
      out$iv.invoke(Integer.valueOf(a$iv)); // 값이 복사 되지 않고 함수를 호출.
   }

   public final void shortFunc(int a, @NotNull Function1 out) {
      int $i$f$shortFunc = 0;
      Intrinsics.checkNotNullParameter(out, "out");
      String var4 = "test";
      System.out.println(var4);
      out.invoke(a);
   }

crossinline 키워드

비지역반환을 금지시켜준다.

fun main() {
		shortFunc(3) {
				println("it : $it")
//			return // crossinline 키워드가 있을경우 금지.
		}
}

inline fun shortFunc(a: Int, crossinline out: (Int) -> Unit) {
    println("test")
    out(a)
		println("finish")
}