kotlin inline, noline, crossline, relified
original source :ย https://leveloper.tistory.com/171
inline ํค์๋์ ๋ํด์๋ ์ฒ์ ์ฝํ๋ฆฐ์ ๊ณต๋ถํ ๋ ๋ณด๊ธด ๋ดค์์ง๋ง, ์ ํํ ์ด๋ค ์ํฉ์์ ์ฌ์ฉํ๋์ง ์์ง ๋ชปํ์๋ค. ์ด๋ฒ์ ์ฝํ๋ฆฐ ํ์ฅ ํจ์๋ฅผ ์ ๋ฆฌํ๋ค๊ฐ inline ํค์๋์ ๋ํ์ฌ ์์ธํ ์๊ฒ ๋์๊ณ , ๊ด๋ จ ๋ด์ฉ์ ๊ธฐ์ ํ๋ ค๊ณ ํ๋ค.
inline ํค์๋๋ฅผ ํ๋ง๋๋ก ์ค๋ช ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๊ณ ์ฐจ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐํ์ ํจ๋ํฐ๊ฐ ์๊ธฐ ๋๋ฌธ์ ํจ์ ๊ตฌํ ์์ฒด๋ฅผ ์ฝ๋์ ๋ฃ์์ผ๋ก์จ ์ค๋ฒํค๋๋ฅผ ์์จ ์ ์๋ค.
์ด๊ฒ ๋์ฒด ๋ฌด์จ ๋ง์ผ๊น? ย ์์๋ฅผ ํตํด ์ข ๋ ์ฝ๊ฒ ์์๋ณด์.
inline
fun doSomething(action: () -> Unit) { ย ย action() } fun callFunc() { ย ย doSomething { ย ย ย ย println("๋ฌธ์์ด ์ถ๋ ฅ!") ย ย } }
์์ ๊ฐ์ ๊ณ ์ฐจ ํจ์๊ฐ ์๋ค๊ณ ํ์. ์ด ์ฝ๋๋ฅผ ์๋ฐ๋ก ๋ณํํ๋ค๋ฉด, ์๋์ ๊ฐ์ด ๋๋ค.
public void doSomething(Function action) { ย ย action.invoke(); } public void callFunc() { ย ย doSomething(System.out.println("๋ฌธ์์ด ์ถ๋ ฅ!"); }
๊ทธ๋ฆฌ๊ณ ์ด ์๋ฐ ์ฝ๋๋ ์๋์ ๊ฐ์ด ๋ณํ๋๋ค.
public void callFunc() { ย ย doSomething(new Function() { ย ย ย ย @Override ย ย ย ย public void invoke() { ย ย ย ย ย ย System.out.println("๋ฌธ์์ด ์ถ๋ ฅ!"); ย ย ย ย } ย ย } }
์ฌ๊ธฐ์ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ฒด ์์ฑ๊ณผ ํจ๊ป ํจ์ ํธ์ถ์ ํ๊ฒ ๋์ด ์์ด์, ์ด๋ฐ ๋ถ๋ถ์์ ์ค๋ฒํค๋๊ฐ ์๊ธธ ์ ์๋ค. inline ํค์๋๋ ์ด๋ฐ ์ค๋ฒํค๋๋ฅผ ์์ ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
inline fun doSomething(action: () -> Unit) { ย ย action() } fun callFunc() { ย ย doSomething { ย ย ย ย println("๋ฌธ์์ด ์ถ๋ ฅ!") ย ย } }
์์ ์ฝ๋๋ฅผ ์๋ฐ๋ก ๋ณํํ๋ฉด ์๋์ ๊ฐ์ด ๋๋ค.
public void callFunc() { ย ย System.out.println("๋ฌธ์์ด ์ถ๋ ฅ!"); }
์์ ๊ฐ์ด Function ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์๊ณ , callFunc() ๋ด๋ถ์ ์ฝ์ ๋์ด ๋ฐ๋ก ์ ์ธ๋๋ค. ์์ ์ฝ๋๊ฐ ์ปดํ์ผ๋ ๋ ์ปดํ์ผ๋ฌ๋ ํจ์ ๋ด๋ถ์ ์ฝ๋๋ฅผ ํธ์ถํ๋ ์์น์ ๋ณต์ฌํ๋ค. ์ปดํ์ผ๋๋ ๋ฐ์ดํธ์ฝ๋์ ์์ ๋ง์์ง๊ฒ ์ง๋ง, ํจ์ ํธ์ถ์ ํ๊ฑฐ๋ ์ถ๊ฐ์ ์ธ ๊ฐ์ฒด ์์ฑ์ ์๋ค.
์ด์ ๊ฐ์ ์ด์ ๋ก inline ํจ์๋ ์ผ๋ฐ ํจ์๋ณด๋ค ์ฑ๋ฅ์ด ์ข๋ค. ํ์ง๋ง inline ํจ์๋ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์, ์ธ์๋ก ์ ๋ฌ๋ฐ์ ํจ์๋ ๋ค๋ฅธ ํจ์๋ก ์ ๋ฌ๋๊ฑฐ๋ ์ฐธ์กฐํ ์ ์๋ค.
inline fun doSomething(action1: () -> Unit, action2: () -> Unit) { ย ย action1() ย ย anotherFunc(action2) // error } fun anotherFunc(action: () -> Unit) { ย ย action() } fun main() { ย ย doSomething({ ย ย ย ย println("1") ย ย }, { ย ย ย ย println("2") ย ย }) }
์์ ์ฝ๋์์ doSomething()์ ๋ ๋ฒ์งธ ์ธ์๋ก ๋๊ฒจ๋ฐ์ action2๋ฅผ ๋ ๋ค๋ฅธ ๊ณ ์ฐจ ํจ์์ธ anotherFunc()์ ์ธ์๋ก ๋๊ฒจ์ฃผ๋ ค ํ๊ณ ์๋ค. ์ด๋ doSomething()์ inline ํจ์๋ก ์ ์ธ๋์ด ์๊ธฐ ๋๋ฌธ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ action2๋ฅผ ์ฐธ์กฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ ๋ฌํ๋ ๊ฒ์ด ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ ๊ฒ ๋ชจ๋ ์ธ์๋ฅผ inline์ผ๋ก ์ฒ๋ฆฌํ๊ณ ์ถ์ง ์์ ๋ ์ฌ์ฉํ๋ ๊ฒ์ด noinline ํค์๋๋ค.
noinline
์ธ์ ์์ noinline ํค์๋๋ฅผ ๋ถ์ด๋ฉด ํด๋น ์ธ์๋ inline์์ ์ ์ธ๋๋ค. ๋ฐ๋ผ์ noinline ํค์๋๊ฐ ๋ถ์ ์ธ์๋ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค.
inline fun doSomething(action1: () -> Unit, noinline action2: () -> Unit) { ย ย action1() ย ย anotherFunc(action2) } fun anotherFunc(action: () -> Unit) { ย ย action() } fun main() { ย ย doSomething({ ย ย ย ย println("1") ย ย }, { ย ย ย ย println("2") ย ย }) }
crossinline
์๋์ ์ฝ๋๋ View์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ณด๋ค ์ฝ๊ฒ ์ฐ๊ฒฐํด์ฃผ๊ธฐ ์ํ ํ์ฅ ํจ์๋ค.
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) ย ย } }
reified
์์ ์์์์ ๋ณด์ธ ํ์ฅ ํจ์๋ฅผ ์ ๋ค๋ฆญ์ ์ฌ์ฉํด์ ์ข ๋ ํ์ฅํด๋ณด์.
inline fun <T: View> T.click(crossinline block: (T) -> Unit) { ย ย setOnClickListener { view -> ย ย ย ย block(view as T) ย ย } }
์์ ์ฝ๋๋ ์ ๋ค๋ฆญ์ ์ฌ์ฉํด์ block์ ์ธ์๋ก View๊ฐ ์๋ T๋ฅผ ๋ฃ์ด์ค๋ค. ์๋ฅผ ๋ค์ด, TextView.click์ผ๋ก ์ฌ์ฉํ๋ค๊ณ ํ๋ฉด ์ธ์๋ก TextView๋ฅผ ๋ฐ๊ธฐ ์ํจ์ด๋ค. ์์ ์ฝ๋์์๋ ์ค๋ฅ๋ ์๋์ง๋ง ๊ฒฝ๊ณ ๋ฉ์์ง๊ฐ ๋ฌ๋ค.
Unchecked cast: View! as T
view๋ฅผ T๋ก ์บ์คํ ํ๋ ค๊ณ ํ ๋ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ๋ฉ์์ง์ด๋ค. ์ด๋ inline ํจ์์์ ํน์ ํ์ ์ ๊ฐ์ก๋์ง ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ด ๋ reified ํค์๋๋ฅผ ์ฌ์ฉํ๋ค.
inline fun <reified T: View> T.click(crossinline block: (T) -> Unit) { ย ย setOnClickListener { view -> ย ย ย ย block(view as T) ย ย } }
ํ์ ํ๋ผ๋ฏธํฐ์ reified ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ๋ฉด ๋ง์น ํด๋์ค์ฒ๋ผ ํ์ ํ๋ผ๋ฏธํฐ์ ์ ๊ทผํ ์ ์๋ค. ์ฐธ๊ณ ๋ก reified๋ inline์ด ์๋ ์ผ๋ฐ ํจ์์์๋ ์ฌ์ฉํ ์ ์๋ค.
์ฐธ๊ณ
medium.com/harrythegreat/kotlin-inline-noinline-%ED%95%9C%EB%B2%88%EC%97%90-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-1d54ff34151c
codechacha.com/ko/kotlin-inline-functions/
์ถ์ฒ:
https://leveloper.tistory.com/171
.
.
.
.
์ฐธ๊ณ ์๋ฃย
ref)ย https://medium.com/android-news/inline-noinline-crossinline-what-do-they-mean-b13f48e113c2













