함수가 호출되는 곳에 내용을 모두 복사한다.
함수의 분기 없이 처리가 가능하다. 이는 성능 증가로 직결된다.
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
는 해당되는 함수로 구성된 인자의 함수를 실행한다.
일부 람다식 함수를 인라인 되지 않게 하기 위해 사용된다.
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);
}
비지역반환을 금지시켜준다.
fun main() {
shortFunc(3) {
println("it : $it")
// return // crossinline 키워드가 있을경우 금지.
}
}
inline fun shortFunc(a: Int, crossinline out: (Int) -> Unit) {
println("test")
out(a)
println("finish")
}