[kotlin] inline, noinline 한번에 이해하기

Harry The Great
해리의 유목코딩
4 min readJun 1, 2018

처음 코틀린에서 람다식과 inline, noinline을 접하게되면 멘붕이옵니다. 아마 친절하지 않은 도큐몬트도 한몫을 하는것같습니다. 그리고 Inline을 찾아보게된다면 대부분 정의는 아래와 같습니다.

고차 함수를 사용하면 런타임 패널티가 있기때문에 함수 구현 자체를 코드 내부에 넣음으로써 오버헤드를 없앨 수 있다.

위 내용이 와닿기 힘든분들을 위해 조금 더 쉽게 설명드리겠습니다.

일급함수

inline, noinline을 이해하기 위해서는 일급함수에 대한 이해가 필수적입니다.이미 알고있으신 내용이면 편하게 스크롤을 내려주세요.일급함수는 스스로 객체로써 취급되는 함수로 다른 함수를 파라미터로 전달받고 반환할 수 있는 함수를 뜻합니다. 이부분은 코드를 보는 편이 더 좋을 것 같습니다.

위 함수를 보겠습니다. 위 함수는 두개의 정수를 받아 하나의 정수값만을 출력하는 함수입니다. 위와같이 선언을 하게된다면 java에서 아래와 같은 코드로 변환을하여 사용할 수 있습니다.

위와같이 자동으로 컨버팅이 될 수 있기때문에 아래와 같은 유동적인 방법도 사용이 가능합니다.

위 코드처럼 sum이나 subtract을 유동적으로 붙일 수 있습니다.

Inline과 noinline

이 함수를 자바로 표현한다면

위 코드와 같습니다. 그리고 이 자바코드는 아래와 같이 변환되게됩니다.

문제는 위 sum이나 Minus처럼 조합하는 함수가 많아질수록 계속 N개만큼의 function 오브젝트가 생성됩니다. 이럴때 사용하게되는것이 inline 키워드입니다.

(inline 키워드 추가)

위 코드는 아래와 같이 변환됩니다.

위와 같이 Function 인스턴스를 만들지 않고 callingFunction 내부에 삽입되어 바로 선언되어지게됩니다. 때문에 람다함수와 1급함수가 호출된곳에서 해당 함수를 가지게되됩니다. 하지만 inline 함수는 주의할점이 있는데 private를 키워드를 사용하여 함수를 정의할 수 없습니다. 대신 다른 접근한정자인 internal을 사용해야합니다.

noinline

모든 람다함수에 inline을 쓰고싶지 않을 수 있습니다. 이 경우 아래와같이 해당 람다함수에 noinline 키워드를 추가하여줍니다.

모든 함수를 inline을 사용하여 내부로 컨버팅 되어지길 원치않을 수 있습니다. 이 경우 위처럼 inline을 먼저 선언한 뒤 람다함수중 사용하지 않을 함수에 noinline키워드를 붙여줍니다.

참고

--

--

Harry The Great
해리의 유목코딩

Android & IOS Developer 😀 미디움 이외에 스니펫이나 디버그노트로 활용하는 https://www.harrymikoshi.com/ 블로그도 운영하고있습니다.