본문 바로가기

kotlin

코틀린 : Inline 함수

Inline 함수

함수는 호출할 때 동적으로 실행

함수 안에서 다른 함수를 호출하거나 재귀함수를 만들게 되면 동적으로 함수를 호출하게 되서 속도가 느려질 수 있습니다.

 

이 경우 함수의 선언문 앞에 inline을 추가하면

함수의 코드가 정적 코드로 변경되서

함수 호출 구문이 일반 실행 구문으로 변경 됩니다.

 

 

만들어진 클래스의 코드는 일반적으로 길어지게 됩니다.

 

 

inline에서 함수가 매개 변수인 경우 정적 코드로 변환 되는 것을 제외하고자 할 때는

>>> noinline 을 추가 하면 됩니다.

 

매개 변수로 대입 된 함수에서 return을 할 수 없도록 하고자 할 때는

>>> crossinline이라고 붙여 주면 됩니다.

 

특정 함수로 리턴 할 때는 return @함수이름 을 이용하면 됩니다.

 

 

Closure

함수 내의 변수의 값을 함수 외부에서 변경하기 위해서 함수를 리턴하는 형태

 

함수 내에서 생성한 변수를 local variable 이기 때문에 함수의 호출이 끝나면 소멸 되어야 하는데

내부 함수에서 그 데이터를 사용하게 되면 그 데이터는 소멸 되지 않고 유지가 됩니다.

 

fun outer() : () -> Unit{
    // n은 지역변수 - 외부에서는 사용 불가
    var n: Int = 1
    // 람다 표현식을 리턴 - 함수를 리턴
    return {
        n = n + 1
        println(n)
    }
}

fun main(arg :Array<String>) {
    // 외부 함수를 호출해서 리턴되는 함수를 변수에 저장
    var inner = outer()
    inner()
    inner()
    inner()
}