์ž๋ฐ” SE 20 ๋ฆด๋ฆฌ์Šค

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€