20๊ฐ์๊ฐ์ ๊ฐ๋ฐ ๋์ Oracle์ OpenJDK ์คํ ์์ค ํ๋ก์ ํธ๋ฅผ ์ฐธ์กฐ ๊ตฌํ์ผ๋ก ์ฌ์ฉํ๋ Java SE 20(Java Platform, Standard Edition 20) ํ๋ซํผ์ ์ถ์ํ์ต๋๋ค. ์ฌ์ฉ๋์ง ์๋ ์ผ๋ถ ๊ธฐ๋ฅ์ด ์ ๊ฑฐ๋ ๊ฒ์ ์ ์ธํ๊ณ Java SE 20์ Java ํ๋ซํผ์ ์ด์ ๋ฆด๋ฆฌ์ค์์ ํ์ ํธํ์ฑ์ ์ ์งํฉ๋๋ค. ์ด์ ์ ์์ฑ๋ ๋๋ถ๋ถ์ Java ํ๋ก์ ํธ๋ ์ ๋ฒ์ ์์ ์คํ๋ ๋ ์์ ์์ด ๊ณ์ ์๋ํฉ๋๋ค. Java SE 86(JDK, JRE ๋ฐ Server JRE)์ ๋ฐ๋ก ์ค์น ๊ฐ๋ฅํ ๋น๋๋ Linux(x64_64, AArch86), Windows(x64_86) ๋ฐ macOS(x64_64, AArch20)์ฉ์ผ๋ก ์ค๋น๋์ด ์์ต๋๋ค. OpenJDK ํ๋ก์ ํธ์์ ๊ฐ๋ฐํ Java 2 ์ฐธ์กฐ ๊ตฌํ์ ์์ฉ ์ ํ์ ๋ํ ๋์ ์ฐ๊ฒฐ์ ํ์ฉํ๊ธฐ ์ํด GNU ClassPath ์์ธ๊ฐ ์๋ GPLvXNUMX ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ์์ ํ ๊ฐ๋ฐฉ๋ฉ๋๋ค.
Java SE 20์ ์ผ๋ฐ ์ง์ ๋ฆด๋ฆฌ์ค๋ก ๋ถ๋ฅ๋๋ฉฐ ๋ค์ ๋ฆด๋ฆฌ์ค ์ ์ ์ ๋ฐ์ดํธ๊ฐ ๋ฆด๋ฆฌ์ค๋ฉ๋๋ค. ์ฅ๊ธฐ ์ง์(LTS) ๋ถ๊ธฐ๋ Java SE 17์ด์ด์ผ ํ๋ฉฐ 2029๋ ๊น์ง ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ต๋๋ค. Java 10 ๋ฆด๋ฆฌ์ค๋ถํฐ ํ๋ก์ ํธ๊ฐ ์ ๊ฐ๋ฐ ํ๋ก์ธ์ค๋ก ์ ํ๋์ด ์ ๋ฆด๋ฆฌ์ค ํ์ฑ ์ฃผ๊ธฐ๊ฐ ๋ ์งง์์ก๋ค๋ ์ ์ ๊ธฐ์ตํ์ญ์์ค. ์๋ก์ด ๊ธฐ๋ฅ์ ์ด์ ์ง์์ ์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ํ๋์ ๋ง์คํฐ ๋ธ๋์น์์ ๊ฐ๋ฐ๋๊ณ ์์ต๋๋ค. ๋ง์คํฐ ๋ธ๋์น๋ ์ด๋ฏธ ์๋ฃ๋ ๋ณ๊ฒฝ ์ฌํญ์ ํตํฉํ๊ณ ์ ๋ฆด๋ฆฌ์ค๋ฅผ ์์ ํํ๊ธฐ ์ํด XNUMX๊ฐ์๋ง๋ค ๋ธ๋์น๊ฐ ๋ถ๊ธฐ๋ฉ๋๋ค.
Java 20์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- Scoped Values์ ๋ํ ์๋น ์ง์์ด ์ ์๋์ด ์ค๋ ๋์์ ๋ถ๋ณ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ณ ํ์ ์ค๋ ๋ ๊ฐ์ ํจ์จ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค(๊ฐ์ด ์์๋จ). Scoped Values๋ ์ค๋ ๋ ๋ก์ปฌ ๋ณ์ ๋ฉ์ปค๋์ฆ์ ๋์ฒดํ๊ธฐ ์ํด ๊ฐ๋ฐ๋๊ณ ์์ผ๋ฉฐ ๋งค์ฐ ๋ง์ ์์ ๊ฐ์ ์ค๋ ๋(์์ฒ, ์๋ฐฑ๋ง ์ค๋ ๋)๋ฅผ ์ฌ์ฉํ ๋ ๋ ํจ์จ์ ์ ๋๋ค. ๋ฒ์ ๊ฐ๊ณผ ์ค๋ ๋ ๋ก์ปฌ ๋ณ์์ ์ฃผ์ ์ฐจ์ด์ ์ ์ฒซ ๋ฒ์งธ ๋ณ์๋ ํ ๋ฒ ์์ฑ๋๊ณ ๋์ค์ ๋ณ๊ฒฝํ ์ ์์ผ๋ฉฐ ์ค๋ ๋ ์คํ ๊ธฐ๊ฐ ๋์๋ง ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ํด๋์ค ์๋ฒ { ์ต์ข ์ ์ ScopedValue CURRENT_USER = new ScopedValue(); void serve(์์ฒญ ์์ฒญ, ์๋ต ์๋ต) { var level = (request.isAuthorized()? ADMIN : GUEST); var user = ์ ์ฌ์ฉ์(๋ ๋ฒจ); ScopedValue.where(CURRENT_USER, ์ฌ์ฉ์) .run(() -> Application.handle(์์ฒญ, ์๋ต)); } } class DatabaseManager { DBConnection open() { var user = Server.CURRENT_USER.get(); if (!user.canOpen()) throw new InvalidUserException(); ์ DBConnection(โฆ)์ ๋ฐํํฉ๋๋ค. } }
- ๋ ์ฝ๋ ํจํด์ ๋ ๋ฒ์งธ ์์ ๊ตฌํ์ด ์ถ๊ฐ๋์ด Java 16 ํจํด ์ผ์น ๊ธฐ๋ฅ์ ํ์ฅํ์ฌ ๋ ์ฝ๋ ์ ํ์ ํด๋์ค ๊ฐ์ ๊ตฌ๋ฌธ ๋ถ์ํฉ๋๋ค. ์: record Point(int x, int y) {} static void printSum(Object obj) { if (obj instanceof Point p) { int x = px(); ์ ์ y = ํ์ด(); System.out.println(x+y); } }
- ์ค์์น ์์์ ํจํด ์ผ์น์ ๋ค ๋ฒ์งธ ์๋น ๊ตฌํ์ด ์ถ๊ฐ๋์ด ์ด์ ์ ๋ฒ๊ฑฐ๋ก์ด if...else ๋ฌธ์ ์ฒด์ธ์ด ์ฌ์ฉ๋์๋ ์ผ๋ จ์ ๊ฐ์ ํ ๋ฒ์ ํฌํจํ๋ ์ผ์ด์ค ๋ ์ด๋ธ์์ ์ ์ฐํ ํ ํ๋ฆฟ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. static String formatterPatternSwitch(Object obj) { return switch(obj) { case Integer i -> String.format("int %d", i); case Long l -> String.format("long %d", l); case Double d -> String.format("double %f", d); ์ผ์ด์ค ๋ฌธ์์ด s -> String.format("๋ฌธ์์ด %s", s); ๊ธฐ๋ณธ๊ฐ -> o.toString(); }; }
- FFM(Foreign Function & Memory) API์ ๋ ๋ฒ์งธ ์๋น ๊ตฌํ์ด ์ถ๊ฐ๋์ด ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํจ์๋ฅผ ํธ์ถํ๊ณ JVM ์ธ๋ถ์ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์คํ์ฌ ์ธ๋ถ ์ฝ๋ ๋ฐ ๋ฐ์ดํฐ์ Java ํ๋ก๊ทธ๋จ์ ์ํธ ์์ฉ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- ๊ฐ์ ์ค๋ ๋์ ๋ ๋ฒ์งธ ์๋น ๊ตฌํ์ด ์ถ๊ฐ๋์์ต๋๋ค. ๊ฐ์ ์ค๋ ๋๋ ๊ณ ์ฑ๋ฅ ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ ์์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ๋ฅผ ํฌ๊ฒ ๋จ์ํํ๋ ๊ฒฝ๋ ์ค๋ ๋์ ๋๋ค.
- ์คํ์ ์ธ Structured Parallelism API์ ๋ ๋ฒ์งธ ๋ณํ์ด ์ถ๊ฐ๋์ด ์๋ก ๋ค๋ฅธ ์ค๋ ๋์์ ์คํ๋๋ ์ฌ๋ฌ ์์ ์ ๋จ์ผ ๋จ์๋ก ์ฒ๋ฆฌํ์ฌ ๋ค์ค ์ค๋ ๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ฐ๋ฐ์ ๋จ์ํํฉ๋๋ค.
- ๋ฒกํฐ API์ ๋ค์ฏ ๋ฒ์งธ ์๋น ๊ตฌํ์ด ์ถ๊ฐ๋์ด x86_64 ๋ฐ AArch64 ํ๋ก์ธ์์์ ๋ฒกํฐ ๋ช ๋ น์ ์ฌ์ฉํ์ฌ ์คํ๋๋ ๋ฒกํฐ ๊ณ์ฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์ ์ ์ฉํ ์ ์์ต๋๋ค(SIMD). ์ค์นผ๋ผ ์์ ์ ์๋ ๋ฒกํฐํ๋ฅผ ์ํด HotSpot JIT ์ปดํ์ผ๋ฌ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ๊ณผ ๋ฌ๋ฆฌ ์ API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณ๋ ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ฒกํฐํ๋ฅผ ๋ช ์์ ์ผ๋ก ์ ์ดํ ์ ์์ต๋๋ค.
์ถ์ฒ : opennet.ru