์ค๋ผํด์ 6๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์ ์คํ ์์ค OpenJDK ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐ ๊ตฌํ์ผ๋ก ์ฌ์ฉํ๋ Java SE 23(Java ํ๋ซํผ, ํ์ค ์๋์ 23)๋ฅผ ์ถ์ํ์ต๋๋ค. ์ผ๋ถ ์ฌ์ฉ๋์ง ์๋ ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋ ๊ฒ์ ์ ์ธํ๋ฉด, Java SE 23๋ ์ด์ Java ํ๋ซํผ ๋ฆด๋ฆฌ์ค์์ ํ์ ํธํ์ฑ์ ์ ์งํฉ๋๋ค. ๋ฐ๋ผ์ ์ด์ ์ ์์ฑ๋ ๋๋ถ๋ถ์ Java ํ๋ก์ ํธ๋ ์ ๋ฒ์ ์์ ๋ณ๊ฒฝ ์์ด ์คํ๋ฉ๋๋ค. Java SE 22(JDK, JRE ๋ฐ ์๋ฒ JRE)์ ์ค์น ์ค๋น ์๋ฃ ๋น๋๊ฐ ์ค๋น๋์ด ์์ต๋๋ค. Linux (x86_64, AArch64) Windows (x86_64) ๋ฐ macOS (x86_64, AArch64). OpenJDK ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ Java 23 ์ฐธ์กฐ ๊ตฌํ์ GPLv2 ๋ผ์ด์ ์ค ํ์ ์์ ํ ์คํ ์์ค์ด๋ฉฐ, GNU ClassPath ์์ธ ์กฐํญ์ด ์ ์ฉ๋์ด ์์ฉ ์ ํ๊ณผ์ ๋์ ๋งํฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
Java SE 23์ ์ ๊ธฐ ์ง์ ๋ฆด๋ฆฌ์ค๋ก ๋ถ๋ฅ๋๋ฉฐ, ๋ค์ ๋ฆด๋ฆฌ์ค๊น์ง ์ ๋ฐ์ดํธ๊ฐ ์ ๊ณต๋ฉ๋๋ค. ์ฅ๊ธฐ ์ง์(LTS) ๋ฆด๋ฆฌ์ค๋ Java SE 21 ๋๋ Java SE 17์ด๋ฉฐ, ๊ฐ๊ฐ 2031๋ ๊ณผ 2029๋ ๊น์ง ์ ๋ฐ์ดํธ๊ฐ ์ ๊ณต๋ฉ๋๋ค(์ผ๋ฐ์ ์ผ๋ก 2028๋ ๊ณผ 2026๋ ๊น์ง ์ ๊ณต). Java SE 8 LTS ๋ฆด๋ฆฌ์ค์ ๋ํ ์ฐ์ฅ ์ง์์ 2030๋ ๊น์ง, Java SE 11์ 2032๋ ๊น์ง ์ ๊ณต๋ฉ๋๋ค.
Java SE์์ ์ ์๋ 23๊ฐ์ง ํ์ ์ค:
- ZGC(Generational Z Garbage Collector) ๊ฐ๋น์ง ์ปฌ๋ ํฐ์ ์์ฑ ๋ชจ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋์ด ์์ต๋๋ค. ์ด ๋ชจ๋๋ "์ค๋๋" ๊ฐ์ฒด์ "์๋ก์ด" ๊ฐ์ฒด๋ฅผ ๋ณ๋๋ก ์ฒ๋ฆฌํ์ฌ ์๋ช ์ด ์งง์ ์ต๊ทผ ์์ฑ๋ ๊ฐ์ฒด๋ฅผ ์ ๋ฆฌํ๋ ํจ์จ์ฑ์ ๋์ ๋๋ค. Generational ZGC๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฆฌ์์ค ํ ๋น ์ค ์ผ์ ์ค๋จ ์ํ์ ์ค์ด๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค CPU ๋ถํ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค. Apache Cassandra 4์์ Generational ZGC๋ฅผ ํ ์คํธํ ๊ฒฐ๊ณผ, ๊ณ ์ ๋ ํ ํฌ๊ธฐ์์๋ ์ฒ๋ฆฌ๋์ด 4๋ฐฐ ์ฆ๊ฐํ๊ณ , ์ฒ๋ฆฌ๋์ ๋ณ๊ฒฝ๋์ง ์์ ํ ํฌ๊ธฐ์์๋ XNUMX๋ถ์ XNUMX๋ก ๊ฐ์ํ์ต๋๋ค.
- JavaDoc์ HTML๊ณผ JavaDoc @ ํ๊ทธ๋ฅผ ํผํฉํ๋ ๋์ Markdown ๋งํฌ์
์ ์ฌ์ฉํ์ฌ ์ฃผ์์ ์ฝ๋๋ฅผ ๋ฌธ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ์ง์ํ๋๋ก ํ์ต๋๋ค.

- ํจํด ๋งค์นญ ๋ฉ์ปค๋์ฆ์ ๋ชจ๋ ์ข ๋ฅ์ ํ ํ๋ฆฟ, instanceof ์ฐ์ฐ์ ๋ฐ switch ๋ธ๋ก์์ ๊ธฐ๋ณธ ์ ํ(int, byte, char ๋ฐ ๊ธฐํ ๊ธฐ๋ณธ์ ์ธ ๋น๊ฐ์ฒด ์ ํ)์ ์ฌ์ฉํ๊ธฐ ์ํ ์๋น ์ง์์ผ๋ก ํ์ฅ๋์์ต๋๋ค. switch (x.getStatus()) { case 0 -> "okay"; case 1 -> "warning"; case 2 -> "error"; case int i -> "unknown status: " + i; } if (i instanceof byte b) { โฆ b โฆ }
- ๋จ์ผ "import module M" ๋ช
๋ น๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ๋ชจ๋์์ ๋ด๋ณด๋ธ ๋ชจ๋ ํจํค์ง๋ฅผ ํ ๋ฒ์ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ์ ์ฌ์ ์ง์ํ์ต๋๋ค. ์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํด๋์ค๋ฅผ ํจํค์ง ๊ณ์ธต ๊ตฌ์กฐ์์ ์์น๋ฅผ ์ง์ ํ์ง ์๊ณ ๋ ํฌํจํ ์ ์๋๋ก ํ์ฌ ๋ชจ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฌ์ฉ์ ํฌ๊ฒ ๊ฐ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด, "import module java.base"๋ฅผ ์ง์ ํ๋ฉด java.base ๋ชจ๋์ ํฌํจ๋ 54๊ฐ์ ๋ชจ๋ ํจํค์ง๊ฐ ๊ฐ์ ธ์ค๊ฒ ๋๋ฉฐ, ์ด์ ์๋ ๊ฐ๋ณ์ ์ผ๋ก ์ฐธ์กฐํด์ผ ํ์ต๋๋ค("import java.io.*", "import java.util.*" ๋ฑ).
Java ํด๋์ค ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์, ์์ฑ ๋ฐ ๋ณํํ๊ธฐ ์ํ ํด๋์ค ํ์ผ API์ ๋ ๋ฒ์งธ ์ด์์ด ์ ์๋์์ต๋๋ค. ClassFile cf = ClassFile.of(); ClassModel classModel = cf.parse(bytes); byte[] newBytes = cf.build(classModel.thisClass().asSymbol(), classBuilder -> { for (ClassElement ce : classModel) { if (!(ce instanceof MethodModel mm && mm.methodName().stringValue().startsWith(ยซdebugยป))) { classBuilder.with(ce); } } });
- ์ด๋ x86_64 ๋ฐ AArch64 ํ๋ก์ธ์์ ๋ฒกํฐ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋๋ ๋ฒกํฐ ๊ณ์ฐ์ ์ํ ํจ์๋ฅผ ์ ๊ณตํ๊ณ ์ฌ๋ฌ ๊ฐ์ ๋์์ ์ฐ์ฐ์ ์ ์ฉํ ์ ์๋๋ก ํ๋(SIMD) ๋ฒกํฐ API์ XNUMX๋ฒ์งธ ์๋น ๊ตฌํ์ ๋๋ค. HotSpot JIT ์ปดํ์ผ๋ฌ์ ์ค์นผ๋ผ ์ฐ์ฐ ์๋ ๋ฒกํฐํ์ ๋ฌ๋ฆฌ, ์๋ก์ด API๋ ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฒกํฐํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ดํ๋ โโ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- java.io.Console ํด๋์ค๊ฐ ์ ํ๋ ๋ก์บ์ ๋ฐ๋ผ ํ ์คํธ๋ฅผ ํฌ๋งทํ๊ณ , ํ์ํ๊ณ , ์ฝ์ ์ ์๋ format, printf, readPassword, readLine ๋ฉ์๋๋ก ์ ๋ฐ์ดํธ๋์์ต๋๋ค. System.console().printf(Locale.FRANCE, "%1$tY-%1$tB-%1$te %1$tA", new Date()) 2024๋ 16์ XNUMX์ผ ๋ชฉ์์ผ
- ์ฌ์ฉ์ ์ ์ ์ค๊ฐ ์ฐ์ฐ์ ์ ์ํ ์ ์๋ ํ์ฅ๋ Stream API์ ๋ ๋ฒ์งธ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๊ฐ ์ถ๊ฐ๋์์ต๋๋ค. ์ด๋ ๊ธฐ์กด ๋ด์ฅ ์ค๊ฐ ์ฐ์ฐ์ผ๋ก๋ ์ํ๋ ๋ฐ์ดํฐ ๋ณํ์ด ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ํธ๋ค๋ฌ๋ ์๋ก์ด ์ค๊ฐ ์ฐ์ฐ Stream::gather(Gatherer)๋ฅผ ํตํด ์ฐ๊ฒฐ๋๋ฉฐ, ์ด ์ฐ์ฐ์ ์ฌ์ฉ์ ์ ์ ํธ๋ค๋ฌ๋ฅผ ์คํธ๋ฆผ ์์์ ์ ์ฉํ์ฌ ์ฒ๋ฆฌํฉ๋๋ค. jshell> Stream.of(1,2,3,4,5,6,7,8,9).gather(new WindowFixed(3)).toList() $1 ==> [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
- "main" ๋ฉ์๋์ ์๋ฌต์ ์ผ๋ก ์ ์ธ๋ ํด๋์ค์ ๋ช ๋ช ๋์ง ์์ ์ธ์คํด์ค์ ์ธ ๋ฒ์งธ ์๋น ๊ตฌํ์ ์ถ๊ฐํ์ต๋๋ค. ์ด ๊ตฌํ์์๋ public/static ์ ์ธ์ด ํ์ ์๊ณ ์ธ์ ๋ฐฐ์ด๊ณผ ํด๋์ค ์ ์ธ๊ณผ ๊ด๋ จ๋ ๋ค๋ฅธ ์ํฐํฐ๋ฅผ ์ ๋ฌํ ํ์๊ฐ ์์ต๋๋ค. // was public class HelloWorld { public static void main(String[] args) { System.out.println("Hello world!"); } } // ์ด์ void main() { System.out.println("Hello, World!"); }
- ํ์ ํด๋์ค ์์ฑ์์์ ๋ถ๋ชจ ํด๋์ค ์์ฑ์๋ฅผ ๋ช ์์ ์ผ๋ก ํธ์ถํ๊ธฐ ์ํด super(โฆ)๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ์์ฑ์๊ฐ ํํ์์ ์ง์ ํ ์ ์๋๋ก ํ๋ ๊ธฐ๋ฅ์ ๋ ๋ฒ์งธ ์ด์์ ์ถ๊ฐํ์ต๋๋ค. ๋จ, ํด๋น ํํ์์ด ์์ฑ์๊ฐ ์์ฑํ๋ ์ธ์คํด์ค๋ฅผ ์ฐธ์กฐํ์ง ์์์ผ ํฉ๋๋ค. class Outer { void hello() { System.out.println("Hello"); } class Inner { Inner() { hello(); super(); } } }
- ๋ฒ์๊ฐ ์ง์ ๋ ๊ฐ์ ์ธ ๋ฒ์งธ ์๋น ๊ตฌํ์ ์ถ๊ฐํ์ฌ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ฌ ์ค๋ ๋์์ ๊ณต์ ํ๊ณ ์์ ์ค๋ ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ตํํ ์ ์๊ฒ ๋์์ต๋๋ค(๊ฐ์ด ์์๋จ). ๋ฒ์๊ฐ ์ง์ ๋ ๊ฐ์ ์ค๋ ๋ ๋ก์ปฌ ๋ณ์ ๋ฉ์ปค๋์ฆ์ ๋์ฒดํ๊ธฐ ์ํด ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ๋งค์ฐ ๋ง์ ์์ ๊ฐ์ ์ค๋ ๋(์์ฒ, ์๋ฐฑ๋ง ๊ฐ์ ์ค๋ ๋)๋ฅผ ์ฌ์ฉํ ๋ ๋์ฑ ํจ์จ์ ์ ๋๋ค. ๋ฒ์๊ฐ ์ง์ ๋ ๊ฐ๊ณผ ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ์ฃผ์ ์ฐจ์ด์ ์ ๋ฒ์๊ฐ ์ง์ ๋ ๊ฐ์ ํ ๋ฒ๋ง ์์ฑ๋๊ณ ๋์ค์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ์ค๋ ๋๊ฐ ์คํ๋๋ ๋์๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
- ๊ตฌ์กฐ์ ๋์์ฑ API์ ์ธ ๋ฒ์งธ ์ด์์ด ํ ์คํธ๋ฅผ ์ํด ๊ณต๊ฐ๋์์ผ๋ฉฐ, ์ฌ๋ฌ ์ค๋ ๋์์ ์คํ๋๋ ์ฌ๋ฌ ์์ ์ ๋จ์ผ ๋จ์๋ก ์ฒ๋ฆฌํ์ฌ ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐ์ ๊ฐ์ํํฉ๋๋ค.
- sun.misc.Unsafe ํด๋์ค๊ฐ ์ ๊ณตํ๋ ์ธ๋ถ(JVM ์ธ๋ถ) ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฉ์๋๋ ๋ ์ด์ ์ฌ์ฉ๋์ง ์์ผ๋ฉฐ ์ญ์ ๋ ์์ ์ ๋๋ค. ์คํํ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ณ ์ธ๋ถ ์ฝ๋์ ์ํธ ์์ฉํ๋ ค๋ฉด VarHandle API์ FFM(Foreign Function & Memory) API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
๋ํ, ๊ทธ๋ํฝ ์ธํฐํ์ด์ค JavaFX 23์ ์ฌ์ฉํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ํ๋ซํผ์ ๋ํ ์ ๋ฐ์ดํธ๊ฐ ๊ฒ์๋์๊ณ , ์ฃผ์ Oracle JDK 23์ GraalVM JIT ์ปดํ์ผ๋ฌ๊ฐ ํฌํจ๋์๋ค๋ ์ ๋ ์ฃผ๋ชฉํ ๋งํฉ๋๋ค.
๋ฒ์ฉ ๊ฐ์ ๋จธ์ GraalVM์ ์๋ก์ด ๋ฆด๋ฆฌ์ค๋ ๊ณต๊ฐ๋์์ต๋๋ค. ์ด ๋ฆด๋ฆฌ์ค๋ JavaScript(Node.js), Python, Ruby, R, JVM์ฉ ์ธ์ด(Java, Scala, Clojure, Kotlin) ๋ฐ LLVM ๋นํธ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํ ์ธ์ด(C, C++, Rust)๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ์คํํ ์ ์๋๋ก ์ง์ํฉ๋๋ค. JDK 23์ ์ง์ํ๋ ๊ฒ ์ธ์๋, ์ ๋ฒ์ ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๊ณผ ์คํ ์ฝ๋ ํฌ๊ธฐ๋ฅผ ์ต์ ํํ๊ณ , JIT ์ปดํ์ผ์ ์ฌ์ฉํ์ฌ Python ๋ฐ WebAssembly๋ฅผ Java ์ฝ๋์ ์๋ฒ ๋ํ๋ ๋๊ตฌ๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํฉ๋๋ค.
์ถ์ฒ : opennet.ru

