본문 바로가기

코틀린

inline, noinline, crossinline

반응형

inline 이란?

고차 함수를 사용하면 런타임 패널티가 있기 때문에 함수 구현자체를 코드에 넣음으로써 오버헤드를 없앨 수 있다.
>> 고차함수는 객체를 생성하기 때문에 생기는 오버헤드라고 볼 수 있습니다.
인라인은 인스턴스를 만들지 않고 코드를 호출하는 위치에 그대로 복사해서 컴파일되는 바이트코드의 양은 많아지겠지만, 추가적인 객체 생성은 없습니다.

 inline 함수는 내부적으로 코드를 복사하기 때문에, 인자로 전달 받은 함수는 다른 함수로 전달되거나 참조할 수 없습니다. 그래서 필요한 것이 noinline입니다. 

noinline

 인자 앞에 noinline 키워드를 붙이면 해당 인자는 inline에서 제외됩니다. 따라서 다른 함수의 인자로 전달하는 것이 가능해집니다.

crossinline

inline fun View.click(block: (View) -> Unit) {
	setOnClickListener { view -> 
    	block(view) // error 
     } 
  }

함수를 인자로 받아 setOnclickListener 내부에서 호출해야하지만 위의 코드는 동작하지 않습니다. inline 함수는 인자로 받은 함수를 다른 실행 컨텍스트를 통해 호출할 때는 함수안에서 비-로컬 흐름을 제어할 수 없습니다. 이럴 때 사용하는 것이 crossinline 키워드 입니다.

inline fun View.click(crossinline block: (View) -> Unit) {
	setOnClickListener { view 
    	-> block(view) 
    } 
}

 

 

참고: https://leveloper.tistory.com/171

반응형

'코틀린' 카테고리의 다른 글

코틀린 Flows의 소개  (0) 2022.04.12
보기 좋은 방법으로 Multiple Coroutine 기다리기  (0) 2022.02.25
코루틴 컨텍스트 전환  (0) 2021.11.24
코루틴 디버깅  (0) 2021.11.10
코틀린 Contracts  (0) 2021.02.07