์ถ์ฒ
https://stackoverflow.com/a/62354389
https://blogs.oracle.com/javamagazine/post/understanding-java-method-invocation-with-invokedynamic
https://docs.deistercloud.com/content/Technology.50/Java/invokedynamic.xml?embedded=true
https://www.baeldung.com/java-invoke-dynamic
๋ฑ์ฅ ๋ฐฐ๊ฒฝ : ๋ฌธ์ ๊ฐ ์์๋ค.
Java 7 ์ด์ ์๋ ๋ค ๊ฐ์ง ๋ฉ์๋ ํธ์ถ ๋ฐฉ์๋ง JVM์ ์กด์ฌํ๋ค.
1. invokevirtual : ์ผ๋ฐ ํด๋์ค ๋ฉ์๋ ํธ์ถ
2. invokestatic : ์ ์ ๋ฉ์๋ ํธ์ถ
3. invokeinterface : ์ธํฐํ์ด์ค ๋ฉ์๋ ํธ์ถ
4. invokespecial : ์์ฑ์๋ private ๋ฉ์๋ ํธ์ถ
์ด ๋ฐฉ์๋ค์ ์ด๋ฏธ ์ฃผ์ด์ง ๋ฐฉ์์ผ๋ก ๊ฐ ๋ฉ์๋ ํธ์ถ์ด ์ด๋ค์ง๋ค. ์ฆ, ์ ์ ๋ฉ์๋ ํธ์ถ ๋ฐฉ์์ผ๋ก๋ง ์ด๋ค์ง๋ค. ๋ ์ ์ฐํ ๋ฉ์๋ ํธ์ถ์ ์ํด ๊ธฐ์กด์๋ ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ ์ด์ฉํ๋ค
1. ์ปดํ์ผ ํ์์ ์ฝ๋ ์์ฑ(code generation)์ ํ๋ค. ์ค์นผ๋ผ๋ ์ฝํ๋ฆฐ ๊ฐ์ ์ธ์ด๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก, ๋ฐํ์ ์ ์ฑ๋ฅ์ด ํจ์จ์ ์ด์ง๋ง, ์์ ์๋๊ฐ ๋๋ ค์ง ์ ์๊ณ ์ฝ๋๊ฐ ์ทจ์ฝํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
2. ๋ฐํ์์ ๋ฆฌํ๋ ์ ์ ์ฌ์ฉํด ๋์ ํธ์ถ์ ๊ตฌํํ๋ค. JRuby์ ๊ฐ์ JVM ๊ธฐ๋ฐ ๋์ ์ธ์ด์์ ์ฌ์ฉ๋๋ค. ๋ฆฌํ๋ ์ ๊ธฐ๋ฐ์ด๋ผ์ ์ฑ๋ฅ์ด ๋ฎ๊ณ ๋นํจ์จ์ ์ด๋ค.
invokedynamic์ผ๋ก ๋์ ์ธ์ด์ ๋ฉ์๋ ํธ์ถ ์ฑ๋ฅ์ ๊ฐ์ ํ๊ณ , ๋์ ์ธ์ด์ ์ํธ์์ฉํ ์ ์๋ JVM ์ธ์ด์ ๋ ์ฝ๊ฒ ์ง์ํ, ์ปดํ์ผ ํ์ ๋ฐ ๋ฐํ์ ๋ชจ๋์์ ๋ ์ ์ฐํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ๋์ ํธ์ถ์ด ๊ฐ๋ฅํด์ก๋ค.
invokedynamic์ ๋ฌด์์ธ๊ฐ
JVM ์์์ ์์์ ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ํธ์ถํ๋ ๋ฐ์ดํธ์ฝ๋ ์ฐ์ฐ์ด๋ค.
invokedynamic์ ๋์
1. ์ฒ์์ผ๋ก invokedynamic์ ํธ์ถํ๋ค.
2. ๋ถํธ์คํธ๋ฉ ๋ฉ์๋(BSM)๊ฐ ์ฒ์ ํธ์ถ๋๋ค. BSM์ด ์คํ๋์ด ํธ์ถ ๊ณผ์ ์ ์ด๊ธฐ ์ค์ ์ ๋ด๋นํ๋ค. ํธ์ถํ ๋ฉ์๋ ํธ๋ค์ ์ค์ ํ๋ค.
3. BSM์ด ์๋ฃ๋๋ฉด CallSite ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. CallSite๋ MethodHandle(JVM์ ์คํํ๋ ์ค์ ๋ก์ง์ ํฌ์ธํฐ)๊ณผ ๋ฐํ๋ CallSite์ ์ ํจ์ฑ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์๋ค. CallSite๋ ์บ์์ ์ ์ฅ๋๋ค.
4. ์ด์ ๋ invokedynamic์ด ํธ์ถ๋๋ฉด ์บ์๋ CallSite๋ก ๋ฉ์๋ ์์ ์ ์ํํ๋ค.
2. ConstantCallSite : BSM์ ํตํด ์ค์ ๋ ํธ์ถ ์ง์ ์ ConstantCallSite๋ก ์์ ํ๋๋ฉฐ, ์ดํ์๋ ์ง์ ํธ์ถ๋์ด JIT ์ปดํ์ผ๋ฌ์ ์นํ์ ์ธ ์ฑ๋ฅ์ ์ ๊ณตํ๋ค.
๋ฉ์๋ ํธ๋ค(MethodHandle) API
MethoadHandle๊ณผ MethodType API๋ก ๋ฉ์๋ ์๋ช ๋ฐ ํธ์ถ์ ๋ ์์ ํ๊ฒ ํํํ ์ ์๋ฐ. MethodHandle์ ๋ฐํ์์ ๋ฉ์๋ ํธ๋ค์ ํธ์ถํ ์ ์์ผ๋ฉฐ, MethodType์ ๋ฉ์๋์ ๋ฐํํ๊ณผ ์ธ์ํ์ ํํํ๋ ํด๋์ค์ด๋ค. ๊ธฐ์กด ๋ฆฌํ๋ ์ API ๋ณด๋ค ๊ฐ๋จํ๊ณ ์์ ํ๊ฒ ๋ฉ์๋ ํธ์ถ์ ๊ด๋ฆฌํ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] ๋๋ค๋ ์๋ฐ๋ก ์ด๋ป๊ฒ ์ปดํ์ผ๋ ๊น (1) | 2024.11.12 |
---|---|
[Kotlin] init ๋ธ๋ก (3) | 2024.11.04 |
[Kotlin] interface ์ default method๋ฅผ ์๋ฐ๋ก ๋ณํํ๊ธฐ (2) | 2024.10.29 |
[Kotlin] const val (0) | 2024.10.29 |
[Kotlin] @JvmOverloads - ๋ํดํธ ํ๋ผ๋ฏธํฐ๋ฅผ ์๋ฐ์์๋ ์ด์ฉํ๊ธฐ (0) | 2024.10.29 |