์ถ์ฒ
https://jerry92k.tistory.com/50
https://kotlinlang.org/docs/whatsnew1520.html#string-concatenation-via-invokedynamic
https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/StringConcatFactory.html
https://www.baeldung.com/java-invoke-dynamic
๋ฌธ์์ด ์ฐ๊ฒฐ (String + ์ฐ์ฐ)์ ์๋ฐ๋ก ์ด๋ป๊ฒ ์ปดํ์ผ๋ ๊น
๋ผ๋ ์ง๋ฌธ์ ๊ฒฐ๊ตญ์ ์ด ์ง๋ฌธ์ด ๋๋ค.
-> JVM์์ ๋ฌธ์์ด ์ฐ๊ฒฐ ์ฒ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ ๊น
โก๏ธ JDK 5 ์ด์
์๋ฐ๋ String + String ์ฐ์ฐ ์ ์๋ก์ด String ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ค.
๐ฎ๋ฌธ์ : ๋งค๋ฒ ์๋ก์ด ๊ฐ์ฒด๊ฐ ์์ฑ๋์ด ๋นํจ์จ์ ์ด๋ค.
โก๏ธ JDK 5 ๋ถํฐ JDK 8๊น์ง
๐ก๋ฌธ์ ํด๊ฒฐ → String + String ์ฐ์ฐ ์ StringBuilder๋ฅผ ๋ด๋ถ์ ์ผ๋ก ์ฌ์ฉํ๋ค. ์ด์ ๋ณด๋ค ๊ฐ์ฒด ์์ฑ ๋น์ฉ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ์ค์ผ ์ ์๋ค.
์ฝํ๋ฆฐ ์ฝ๋์ ์๋ฐ๋ก์ ์ปดํ์ผ
1. ์ฝํ๋ฆฐ ์ฝ๋์์ ๋ฌธ์์ด ํ ํ๋ฆฟ ์ฌ์ฉ
2. ์ฝํ๋ฆฐ ๋ฐ์ดํธ ์ฝ๋, ์๋ฐ 1.8 ๋ฒ์ (JVM 8)
๐ฎ๋ฌธ์ : ๋ฐ๋ณต๋ฌธ์ ๋ ๋๋ง๋ค ์๋ก์ด StringBuilder๊ฐ ์์ฑ๋๋ค.
๐ฎ ๊ทธ ์ธ StringBuilder์ ๋ ๋ค๋ฅธ ๋ฌธ์
StringBuilder๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ผ์ ๊ฐ์ฒด ํ๋๋ฅผ ๋ฐ๋ณตํด์ ์ฌ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ธ๋ฐ, StringBuilder๋ฅผ ์ ๊ฐ์ฒด๋ก ์ฌํ ๋นํ๋ ๊ฒฝ์ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ๋ฌธ์ ๊ฐ ์๊ธด๋ค.
์์
StringBuilder sb = new StringBuilder();
sb.append("Hello, ");
sb.append("world!");
sb = new StringBuilder(); // ์ด์ ์ sb์ ๋ํ ์ฐธ์กฐ๋ ์ฌ๋ผ์ง๊ณ ์๋ก ํ ๋น๋จ
sb.append("Goodbye, ");
sb.append("world!");
โก๏ธ JDK 9 ์ดํ
๐ก๋ฌธ์ ํด๊ฒฐ → StringConcatFactory.makeConcatWithConstants๋ฅผ ๋์ ํด String + String ์ฐ์ฐ ์ ์ฌ์ฉํ๋ค.
๐ค StringConcatFactory.makeConcatWithConstants๋ ๋ฌด์์ธ๊ฐ
https://docs.oracle.com/javase/9/docs/api/java/lang/invoke/StringConcatFactory.html
StringConcatFactory.makeConcatWithConstants
๊ณต์ ๋ฌธ์์ ์ค๋ช
Facilitates the creation of optimized String concatenation methods, that can be used to efficiently concatenate a known number of arguments of known types, possibly after type adaptation and partial evaluation of arguments. Typically used as a bootstrap method for invokedynamic call sites, to support the string concatenation feature of the Java Programming Language.
์ต์ ํ๋ ๋ฌธ์์ด ์ฐ๊ฒฐ ๋ฉ์๋์ ์์ฑ์ ์ฉ์ดํ๊ฒ ํ๋ ๊ธฐ๋ฅ์ผ๋ก, ์๋ ค์ง ์ ํ์ ์๋ ค์ง ๊ฐ์์ ์ธ์๋ฅผ ํจ์จ์ ์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๊ณ , ์๋ง๋ ํ์ ๋ณํ ๋ฐ ์ธ์์ ๋ถ๋ถ์ ํ๊ฐ ํ์ ์ด๋ค์ง ๊ฒ์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก invokedynamic ํธ์ถ โโ์์ ๋ค์ ๋ถํธ์คํธ๋ฉ ๋ฉ์๋๋ก ์ฌ์ฉ๋์ด Java ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋ฌธ์์ด ์ฐ๊ฒฐ ๊ธฐ๋ฅ์ ์ง์ํ๋ค.
- type adaption ํ์ ๋ณํ : ์๋ฐ์์ ๋ฌธ์์ด์ ๊ฒฐํฉํ ๋ ์ซ์๋ ๋ค๋ฅธ ํ์ ์ด ๋ฌธ์์ด๋ก ์๋ ๋ณํ๋๋ ๊ฒ
- partial evalution ๋ถ๋ถ ํ๊ฐ : ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์ ์ ์ปดํ์ผ๋ฌ๊ฐ ๋ฏธ๋ฆฌ ๊ณ์ฐํ ์ ์๋ ๊ฐ์ ๊ฒ์ฐํด ๋๋ ์ต์ ํ ๊ณผ์
- invokedynamic : Java 7์ ๋์
๋ ๋ฐ์ดํธ์ฝ๋ ๋ช
๋ น์ด. ๋ฐํ์์ ๋ฉ์๋ ํธ์ถ ๋ฐฉ์์ ๊ฒฐ์ ํ๋๋ก ํ๋ค(=๋์ ์ผ๋ก ๊ฒฐ์ ํ๋๋ก ํ๋ค). (์ผ๋ฐ์ ์ธ ์๋ฐ ๋ฉ์๋ ํธ์ถ์ ์ปดํ์ผ ์์ ์ ๋ฐ์ธ๋ฉ๋๋ค.)
- ๊ด๋ จ ๊ธ -> [JVM] invokedynamic ์ดํดํ๊ธฐ
- invokedynamic ๊ฐ๋ต ์ค๋ช : ๋์ ๋ฉ์๋ ํธ์ถ ๋ฐฉ์์ผ๋ก, ์ฒ์ ํธ์ถ ์์ bootstrap method๋ฅผ ํธ์ถํ๊ณ ๋ฐ์ CallSite๋ฅผ ์์ฑํ๋ค. ์ดํ์ ๋ฉ์๋๊ฐ ๋ค์ ์คํ๋๋ฉด ์ด CallSite๋ฅผ ์ด์ฉํด ๋ฉ์๋๋ฅผ ์คํํ๋ค.
- bootstrap method : bootstrap์ ์์คํ ์ด๋ ํ๋ก๊ทธ๋จ์ด ์ค์ค๋ก ์ด๊ธฐํํด ๋์ํ ์ ์๋ ์ค๋น ์ํ๋ก ๋ง๋๋ ๊ณผ์ ์ผ๋ก, bootstrap method๋ ๋ฐํ์์์ ํธ์ถํ ๋ฉ์๋๋ฅผ ๋์ ์ผ๋ก ๊ฒฐ์ ํ๋ ์ด๊ธฐํ ์ญํ ์ ํ๋ค.
public static CallSite makeConcatWithConstantsโ(MethodHandles.Lookup lookup,
String name,
MethodType concatType,
String recipe,
Object... constants)
throws StringConcatException
- MethodHandlers.Loopup lookup: ํธ์ถ ์ฌ์ดํธ์ ๋ฃฉ์
์ปจํ
์คํธ. ์๋ฐ ๋ฐํ์์ด ํธ์ถํ ๋ฉ์๋ ์ฐธ์กฐ๋ฅผ ๋์ ์ผ๋ก ๊ฒ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
- MethodHandles : ๋ฉ์๋๋ฅผ ์ฐพ๊ณ , ์กฐ์ ํ๊ณ , ํธ์ถํ๊ธฐ ์ํ ์ ์์ค ๋งค์ปค๋์ฆ
- ๋ฃฉ์ ์ปจํ ์คํธ : ํน์ ํด๋์ค๋ ์ค์ฝํ ๋ด์์ ๋ฉ์๋, ํ๋, ์์ฑ์์ ๋ํ ์ฐธ์กฐ๋ฅผ ์์ ํ๊ฒ ๊ฒ์ํ๊ณ ์ ๊ทผํ ์ ์๊ฒ ๋๋๋ค.
- String name: ํธ์ถํ ๋ฉ์๋์ ์ด๋ฆ
- Methodype concatType : ํธ์ถํ ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ ํ์ ๊ณผ ๋ฐํ ํ์
- String receipe : ๊ฒฐํฉํ ๋ฌธ์์ด์ ํ
ํ๋ฆฟ(๋ ์ํผ). ์์์ ์๋ฆฌ ํ์์๊ฐ ํฌํจ๋ ๊ตฌ์กฐ
- ๋ ์ํผ : ์ฐ๊ฒฐ๋ ๋ฌธ์์ด์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ก, ๋ถํธ์คํธ๋ฉ ๋ฉ์๋์ ์ ๋ฌ๋๋ ์ธ์์ ์๋ฅผ ์ค์ฌ์ค๋ค. ๋ชจ๋ ๋์ ์ธ์์ ํ๋์ ๋ฆฌ์ํผ๋ง ์ ๋ฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
- Object[] constants : ํ ํ๋ฆฟ์ ์ฝ์ ํ ๊ฐ ๋ชฉ๋ก
- CallSite : ๋ฐํ์์ ๊ฒฐํฉ๋ ๋ฌธ์์ด์ ํธ์ถํ ์ ์๋ ์ฐธ์กฐ
์ฆ, ๋ฉ์๋ ํธ์ถ์ CallSite์ ์ฐ์ฐ์ ๋ชจ์๋๋ค๊ฐ ๋ง์ง๋ง์ ํ ๋ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋น๋ฐ์์ String์ ํ ๋ฒ์ ๋ง๋ ๋ค.
์ฝํ๋ฆฐ ์ฝ๋์ ์๋ฐ๋ก์ ์ปดํ์ผ
1. ์ฝํ๋ฆฐ ์ฝ๋์์ ๋ฌธ์์ด ํ ํ๋ฆฟ ์ฌ์ฉ
2. ์ฝํ๋ฆฐ ๋ฐ์ดํธ ์ฝ๋, ์๋ฐ 9 ๋ฒ์ (JVM 9)
makeConcatWithContstants๊ฐ StringBuilder๋ณด๋ค ํจ์จ์ ์ธ ์ด์
๋ฌธ์์ด ์ฐ๊ฒฐ์ ์ํด ์ปดํ์ผ๋ฌ๊ฐ ์ฌ์ฉํ๋ ๋์ ์ต์ ํ ๋ฐฉ์ ๋๋ฌธ. invokedynamic๊ณผ ํจ๊ป ์๋ํด ์์์ ๋ณ์๊ฐ ์์ธ ๋ฌธ์์ด ๊ฒฐํฉ์ ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ฉฐ, ์์ ๋ฌธ์์ด์ ๋ฏธ๋ฆฌ ๊ฒฐํฉํด ๋๋ ๋ฐฉ์์ผ๋ก ์ฑ๋ฅ์ ์ต์ ํํด์ ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ฑ๊ณผ ์๋๊ฐ ํฅ์๋๋ค.
๐ ์ฝํ๋ฆฐ 1.5.20 ๋ฒ์ ์์ JVM์ด 9 ๋ฒ์ ์ด์์ด๋ฉด, ์ปดํ์ผ StringconcatFactory.makeConcatWithConstants()๋ฅผ ๋ฌธ์์ด ์ฐ๊ฒฐ์ ์ํด ์ฌ์ฉํ๋ค.
https://kotlinlang.org/docs/whatsnew1520.html#string-concatenation-via-invokedynamic