๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Java

Modern Java: An In-Depth Guide from Java 8 to Java 21

by ์ฃผ๋ฐœ2 2024. 9. 8.
๋ฐ˜์‘ํ˜•

Modern Java์— ๋Œ€ํ•ด, Java 8 ~ Java 21๊นŒ์ง€์˜ ๋ณ€๊ฒฝ์ง€์ ์„ ์ •๋ฆฌํ•ด๋ณด๋Š” ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

 

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์•„๋ž˜ ๋ธ”๋กœ๊ทธ๋ฅผ ๋ฒˆ์—ญํ•œ ํฌ์ŠคํŒ…์ž…๋‹ˆ๋‹ค.

https://medium.com/@akineralkan/modern-java-an-in-depth-guide-from-version-8-to-21-by-akiner-alkan-f89b50e13c72

 

Modern Java: An In-Depth Guide from Version 8 to 21 | by Akiner Alkan

Discover Java’s evolution from 8 to 21, unveiling features like lambdas to sealed classes and records.

medium.com

 

์ž๋ฐ” 8์„ ์‹œ์ž‘์œผ๋กœ ํฅ๋ฏธ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์€ ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋”ฉํ•˜๋Š” ๋ฐฉ์‹์„ ๋ณ€ํ™”์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์‹๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ํ•ด์ค€ ์ŠคํŠธ๋ฆผ API๊นŒ์ง€, ์ž๋ฐ” 8์€ ๊ฒŒ์ž„ ์ฒด์ธ์ €์˜€์Šต๋‹ˆ๋‹ค.

sealed ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ณ , records๋Š” ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ž๋ฐ” 21์˜ ์—…๋ฐ์ดํŠธ ๋‚ด์šฉ์„ ์‚ดํŽด๋ณผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•œ ์„ค๋ช…๊ณผ ์‹ค์šฉ์ ์ธ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ํ˜„๋Œ€์ ์ธ ์ž๋ฐ” ๊ธฐ๋Šฅ์„ ์„ธ๋ถ„ํ™”ํ•˜๋ฉด์„œ ์—ฌ์ •์— ์ฐธ์—ฌํ•˜์„ธ์š”. ๊ธ€์ด ์ƒ๋‹นํžˆ ๊ธธ์–ด์งˆ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ฝ๊ธฐ ํŽธํ•˜๋„๋ก ๋” ์ž‘์€ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

 

 

์š”์•ฝ

Java 8

  • Lambda Expression
  • Stream API
  • Method Reference
  • Default Methods
  • Date and Time API
  • Optional *

Java 9

  • Java Module System
  • Try-with-resources
  • Private Interface Methods

Java 10

  • Local Variable Type Inference

Java 11

  • Local Variable Type in Lambda Expressions

Java 12

  • String Indent and Transform
  • Files Mismatch

Java 13

  • TextBlocks

Java 14

  • Yield Keyword

Java 15

  • Garbage Collector Updates

Java 16

  • Pattern Matching for instanceof
  • Records

Java 17

  • Sealed Class

Java 21

  • Virtual Threads
  • Sequenced Collections
  • String Templates
  • Record Patterns

https://www.java.com/releases/

 

 

Java 8

Lambda Expression

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ, ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŒจ๋Ÿฌ๋‹ค์ž„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ„๋„์˜ ๋ช…์‹œ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ ๋„ ์ž‘์€ ์ธ๋ผ์ธ ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์ž๋ฐ”์™€ ๊ฐ™์€ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜๋Š” ์–ธ์–ด์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

Stream API

์ŠคํŠธ๋ฆผ API๋Š” ์ž๋ฐ” 8์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์œผ๋กœ ๋ฐ์ดํ„ฐ์˜ ์ปฌ๋ ‰์…˜(list, arrays)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ณด๋‹ค ๊ธฐ๋Šฅ์ ์ด๊ณ  ์„ ์–ธ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ŠคํŠธ๋ฆผ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋“ค์— ๋Œ€ํ•ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ณ  ํ‘œํ˜„์ ์ธ ๋ฐฉ์‹์œผ๋กœ ๋‹ค์–‘ํ•œ ์ž‘์—…(filtering, mapping, reducing)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์ƒํ™ฉ๋“ค์ด ์ŠคํŠธ๋ฆผ API์™€ ํ•จ๊ป˜ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

์œ„ ์˜ˆ์‹œ๋Š” ๊ณผ์ผ ๋ชฉ๋ก์—์„œ ์ŠคํŠธ๋ฆผ ์ƒ์„ฑ ํ›„ ๊ธธ์ด๊ฐ€ 5๊ธ€์ž๋ณด๋‹ค ํฐ ๊ณผ์ผ์„ ํ•„ํ„ฐ๋งํ•˜๊ณ (filter), ๋‚˜๋จธ์ง€ ์š”์†Œ๋ฅผ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜ํ•˜๊ณ (map), ๊ฒฐ๊ณผ๋ฅผ ์ƒˆ๋กœ์šด list๋กœ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ŠคํŠธ๋ฆผ API๋Š” ์ฝ”๋“œ๋ฅผ ๋” ์‰ฝ๊ฒŒ ์ฝ๊ณ , ์—ฌ๋Ÿฌ ์ž‘์—…๋“ค์— ๋Œ€ํ•œ ์ฒด์ด๋‹ ๋ฐฉ์‹์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Method Reference

๋ฉ”์„œ๋“œ ์ฐธ์กฐ๋Š” ๋ฉ”์„œ๋“œ๋‚˜ ์ƒ์„ฑ์ž๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ์ŠคํŠธ๋ฆผ API๋‚˜ ๋žŒ๋‹ค์™€ ๊ฐ™์€ ๊ณ ์ฐจ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ์ถ•์•ฝ ๊ตฌ๋ฌธ์„ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๋ณต์ œํ•˜๋Š” ๋žŒ๋‹ค ์‹์„ ์ œ๊ณตํ•˜๋Š” ๋Œ€์‹  ๋ฉ”์„œ๋“œ ์ด๋ฆ„์œผ๋กœ ์ง์ ‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ฐฐ์—ด ์ •๋ ฌ์— ๋ช…์‹œ์  ๋žŒ๋‹ค ์‹ `(a, b) -> a.compareToIgnoreCase(b))`๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฉ”์„œ๋“œ ์ฐธ์กฐ ๋ฐฉ์‹๊ณผ์˜ ๋น„๊ต๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

 

Default Methods

default ๋ฉ”์„œ๋“œ๋Š” ๊ตฌํ˜„์ฒด๊ฐ€ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค์— ์ •์˜๋œ ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ธฐ์กด ํด๋ž˜์Šค์™€์˜ ํ˜ธํ™˜์„ฑ์„ ๊นจ์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

default ๋ฉ”์„œ๋“œ๋Š” ๋ชจ๋“  ๊ตฌํ˜„ ๋ชจ๋“  ๊ตฌํ˜„์ฒด์˜ ํด๋ž˜์Šค๊ฐ€ ์ƒˆ ๋ฉ”์„œ๋“œ์— ๋Œ€ํ•œ ๊ตฌํ˜„์ฒด๋ฅผ ์ œ๊ณตํ•˜๋„๋ก ๊ฐ•์š”ํ•˜์ง€ ์•Š๊ณ  ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” Greeting ์ธํ„ฐํŽ˜์ด์Šค๋Š” default ๋ฉ”์„œ๋“œ์ธ greet()๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Person ํด๋ž˜์Šค๋Š” Greeting ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ์ง€๋งŒ, greet() ๋ฉ”์„œ๋“œ๊ฐ€ ๊ธฐ๋ณธ ๊ตฌํ˜„์ฒด๋ฅผ ์ƒ์†ํ•˜๋ฏ€๋กœ ์ž์ฒด์ ์ธ ๊ตฌํ˜„์„ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. person.greet() ํ˜ธ์ถœ์€ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ธฐ๋ณธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

Date and Time API (๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API)

Java 8์— ์†Œ๊ฐœ๋œ Date and Time API๋Š” ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ๊ด€๋ จ ์ž‘์—…์„ ํฌ๊ด„์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๋ฉฐ, ์ด์ „ java.util.Date ๋ฐ java.util.Calendar ํด๋ž˜์Šค์˜ ํ•œ๊ณ„์™€ ๋ณต์žก์„ฑ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” dates, times, periods, durations, time zones, ๊ธฐํƒ€ ๋“ฑ๋“ฑ์„ ๋‚˜ํƒ€๋‚ด๋Š” ํด๋ž˜์Šค๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ๊ฐœ์š” ๋ฐ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ๋Š” java.time ํŒจํ‚ค์ง€์—์„œ dates, times, date-time ๋“ฑ ์ž‘์—…ํ•  ํด๋ž˜์Šค๋ฅผ import ํ•ฉ๋‹ˆ๋‹ค.

LocalDate, LocalTime, LocalDateTime ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค๊ณ , DateTimeFormatter ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‚ ์งœ๋ฅผ ํฌ๋งทํŒ… ๋ฐ ํŒŒ์‹ฑ ํ•ฉ๋‹ˆ๋‹ค.

 

Java์˜ Date, Time API๋Š” ์ด์ „ ๋ฒ„์ „์— ๋น„ํ•ด ๋” ์ง๊ด€์ ์ด๊ณ , ๋ถˆ๋ณ€ํ•˜๋ฉฐ, ์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 

time zones, time durations, ๋‚ ์งœ ์ฐจ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ZonedDateTime, Duration, Period์™€ ๊ฐ™์€ ํด๋ž˜์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

API๋Š” ์ด์ „ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ํด๋ž˜์Šค์—์„œ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ์‹œ๊ฐ„ ๊ณ„์‚ฐ ๋ฐ ์ผ๊ด‘ ์ ˆ์•ฝ ์‹œ๊ฐ„(?) ์กฐ์ •๊ณผ ๊ด€๋ จ๋œ ์ผ๋ฐ˜์ ์ธ ํ•จ์ •์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

๊ณผ๊ฑฐ API์—์„œ ์‹ ๊ทœ API๋กœ์˜ ์ „ํ™˜์— ๋Œ€ํ•œ ๋” ์ž์„ธํ•œ ์„ค๋ช…์€ Baeldung page ๋ฅผ ํ†ตํ•ด ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Java 9

Java Module System

Java 9์— ๋„์ž…๋œ Java ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ๋ชจ๋“ˆ์‹์ด๊ณ  ์œ ์ง€ ๋ณด์ˆ˜๊ฐ€ ๊ฐ€๋Šฅํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” Java ํ”Œ๋žซํผ์˜ ๊ทผ๋ณธ์  ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์Šคํ…œ์€ ์ž๋ฐ” ์ƒํƒœ๊ณ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋œ ์บก์Šํ™”, ํด๋ž˜์Šค ์˜ค์—ผ, ๋ฒ„์ „ ์ถฉ๋Œ๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค

 

Key Conecpts:

 

Module

  • ๋ชจ๋“ˆ์€ ๊ตฌํ˜„์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ, ์˜์กด์„ฑ์„ ์บก์Šํ™”ํ•˜๊ณ , ๋ช…ํ™•ํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋…๋ฆฝํ˜• ์ฝ”๋“œ ๋‹จ์œ„์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ํŒจ์บ์ง€์™€ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•จ๊ป˜ ๊ทธ๋ฃนํ™”ํ•˜์—ฌ ๋” ๋†’์€ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Module Descriptor (module-info.java)

  • ๊ฐ ๋ชจ๋“ˆ์—๋Š” module-info.java๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์— ์ง€์ •๋œ module descriptor๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์„ค๋ช…์ž๋Š” ๋ชจ๋“ˆ์˜ ์ด๋ฆ„, ์˜์กด์„ฑ, ํŒจํ‚ค์ง€, ๊ธฐํƒ€ ๋ชจ๋“ˆ ๊ด€๋ จ ์„ค์ •์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

Module Path

  • ๋ชจ๋“ˆ ๊ฒฝ๋กœ๋Š” ์ž๋ฐ” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์˜์กด์„ฑ์„ ์ง€์ •ํ•˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์œผ๋กœ, ์ „ํ†ต์ ์ธ ํด๋ž˜์Šค ๊ฒฝ๋กœ๋ฅผ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ ์˜์กด์„ฑ๊ณผ ๋ช…์‹œ์ ์ธ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ์ˆ ๋˜๋ฏ€๋กœ ํด๋ž˜์Šค ๊ฒฝ๋กœ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

 

Java์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ํ‚ค์›Œ๋“œ์™€ ๊ฐœ๋…์„ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ‚ค์›Œ๋“œ๋Š” ๋ชจ๋“ˆ ์„ ์–ธ์„ ์ •์˜ํ•˜๊ณ , Java ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋‚ด์˜ ๋ชจ๋“ˆ, ์„œ๋น„์Šค ๋ฐ ํŒจํ‚ค์ง€ ๊ฐ„ ๊ด€๊ณ„๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ๊ณผ ๊ด€๋ จ๋œ ์ฃผ์š” ํ‚ค์›Œ๋“œ์ž…๋‹ˆ๋‹ค.

module: ๋ชจ๋“ˆ, ์ด๋ฆ„, ์˜์กด์„ฑ, ๋‹ค๋ฅธ ํŠน์„ฑ๋“ค์„ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์„ ์–ธ์€ module-info.java ํŒŒ์ผ์— ํ•ฉ๋‹ˆ๋‹ค.

requires: ๋ชจ๋“ˆ ์˜์กด์„ฑ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ํ•„์š”ํ•œ ๋ชจ๋“ˆ์€ exportํ•œ ํŒจํ‚ค์ง€์™€ ํ•ด๋‹น ๋ชจ๋“ˆ์˜ ๊ณต๊ฐœ ์œ ํ˜•์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

exports: ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ค์ง€๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. exported ํŒจํ‚ค์ง€๋Š” ๋ชจ๋“ˆ์˜ public API๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

opens: ํŒจํ‚ค์ง€์— ๋Œ€ํ•œ ๋ฐ˜์‚ฌ์ ์ธ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ํŠน์ • ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ํŒจํ‚ค์ง€์˜ private members์—๊ฒŒ ๋Ÿฐํƒ€์ž„ ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

uses: ๋ชจ๋“ˆ์ด ์„œ๋น„์Šค๋ฅผ ์†Œ๋น„ํ•œ๋‹ค๊ณ  ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” ์„œ๋น„์Šค ๊ด€๊ณ„๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ provides ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

provides: ๋ชจ๋“ˆ์—์„œ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค ๊ตฌํ˜„์„ Java Service Provider Interface ์˜ ์ผ๋ถ€๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

with: provides ์—์„œ ์„œ๋น„์Šค ์ œ๊ณต์ž ํด๋ž˜์Šค๋ฅผ ์„ ์–ธํ•  ๋•Œ ์‚ฌ์šฉํ•  ์„œ๋น„์Šค ๋กœ๋” ๊ตฌํ˜„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

to: ์—ฌ๋Ÿฌ providers๊ฐ€ ์ •์˜๋  ๋•Œ provides์—์„œ ์„œ๋น„์Šค ๊ณต๊ธ‰์ž ํด๋ž˜์Šค๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.

 

Try-with-resources

try-with-resources ๊ตฌ๋ฌธ์€ Java์—์„œ try ๋ธ”๋ก ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ์ž๋™์œผ๋กœ close ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ œ๋Œ€๋กœ ๋‹ซํžˆ๋„๋ก ํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ๊ฐ„์†Œํ™”ํ•ฉ๋‹ˆ๋‹ค. try-with-resoucres ๋ฌธ์—์„œ ์‚ฌ์šฉ๋˜๋Š” Resources๋Š” AutoCloseable ํ˜น์€ java.io.Closeable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

Java 9์—์„œ, try-with-resources ๊ตฌ๋ฌธ์€ try ๋ธ”๋ก ๋‚ด์—์„œ ์„ ์–ธ๋œ final ๋ณ€์ˆ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋„๋ก ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ํ–ฅ์ƒ๋œ ๊ธฐ๋Šฅ์€ ๋ฆฌ์†Œ์Šค๋ฅผ try ๋ธ”๋ก ๋‚ด์—์„œ ์ง์ ‘ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋‹จ์ˆœํ™”ํ•˜๊ณ , ๊ฐ€๋…์„ฑ์„ ๊ฐœ์„ ํ•˜๊ณ , ์‹ค์ œ ํ•„์š”ํ•œ ๋ณ€์ˆ˜ ์Šค์ฝ”ํ”„๋ฅผ ์ค„์ด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Private Interface Methods

Private ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ private ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ” 9์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ์ฃผ๋กœ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ๊ณผ ๊ฐ€๋…์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ธํ„ฐํŽ˜์ด์Šค ์ž์ฒด ๋‚ด์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์˜๋„๋ฅผ ์ง€๋‹ˆ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค ์™ธ๋ถ€์— ํด๋ž˜์Šค ๋˜๋Š” ๋‹ค๋ฅธ ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์žฌ์ •์˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

 

 

Java 10

Local Variable Type Inference

์ข…์ข… "var" ํƒ€์ž…์ด๋ผ๊ณ ๋„ ํ•˜๋Š” ๋กœ์ปฌ ๋ณ€์ˆ˜ ํƒ€์ž… ์ถ”๋ก ์€, ๋กœ์ปฌ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ๋กœ์ปฌ ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋Š” Java 10์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ํ• ๋‹น๋œ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€์ˆ˜์˜ ํƒ€์ž…์„ ์ถ”๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๊ฐ•๋ ฅํ•œ ํƒ€์ดํ•‘์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

var ํƒ€์ž…์€ ์ดˆ๊ธฐํ™”๋œ ๋กœ์ปฌ ๋ณ€์ˆ˜์—๋งŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋ฉ”์„œ๋“œ์˜ ํŒŒ๋ผ๋ฏธํ„ฐ, ๋ฐ˜ํ™˜ ํƒ€์ž…, ํด๋ž˜์Šค ํ•„๋“œ, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. var๋Š” ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ๋ฅผ ๊ฐ์†Œ์‹œํ‚ค์ง€๋งŒ ๋ช…ํ™•์„ฑ์„ ์œ„ํ•ด ์˜๋ฏธ ์žˆ๋Š” ๋ณ€์ˆ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

 

๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, var๋ฅผ ๊ณผ๋„ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Java 11

Local Variable Type in Lambda Expressions

๋กœ์ปฌ ๋ณ€์ˆ˜ ํƒ€์ž… ์ถ”๋ก  ("var" ํƒ€์ž…)์€ ๋˜ํ•œ ๋žŒ๋‹ค ํ‘œํ˜„์‹์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Java 11์— ๋„์ž…๋˜์–ด var๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋žŒ๋‹ค์‹ ๋‚ด์˜ ๋ณ€์ˆ˜ ํƒ€์ž…์„ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ •์  ํƒ€์ดํ•‘์˜ ์ด์ ์„ ์œ ์ง€ํ•˜๋ฉด์„œ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋‹ค์Œ์€ ๋žŒ๋‹ค ํ‘œํ˜„์‹์—์„œ ๋กœ์ปฌ ๋ณ€์ˆ˜ ํƒ€์ž…์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•œ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

 

 

Java 12

String Indent and Transform

Indent ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด์˜ ๊ฐ ์ค„์— ๋“ค์—ฌ ์“ฐ๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ผ์ธ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์ง€์ •๋œ ์ˆ˜์˜ ๊ณต๋ฐฑ์ด ์ถ”๊ฐ€๋œ ์ƒˆ ๋ฌธ์ž์—ด ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

 

 

Transform ๋ฉ”์„œ๋“œ๋Š” ๋ฌธ์ž์—ด์— ๋ณ€ํ™˜ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ณด๋‹ค ๊ธฐ๋Šฅ์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ๋กœ ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

Files Mismatch

Files.mismatch() ๋ฉ”์„œ๋“œ๋Š” Java์˜ java.nio.file ํŒจํ‚ค์ง€์— ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋‘ ํŒŒ์ผ์˜ ๋‚ด์šฉ ์ฐจ์ด๋ฅผ ๋น„๊ตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค. ์ด ๋ฉ”์„œ๋“œ๋Š” ํŒŒ์ผ์˜ ์ „์ฒด ๋‚ด์šฉ์„ ์ฝ์„ ํ•„์š” ์—†์ด ๋‘ ํŒŒ์ผ์˜ ๋‚ด์šฉ์ด ๋‹ค๋ฅธ์ง€ ์—ฌ๋ถ€๋ฅผ ํšจ์œจ์ ์œผ๋กœ ํŒ๋‹จํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฝ”๋“œ์—์„œ Files.mismatch() ๋ฉ”์„œ๋“œ๋Š” filePath1 ๋ฐ filePath2์—์„œ ์ฐธ์กฐํ•˜๋Š” ํŒŒ์ผ์˜ ๋‚ด์šฉ์„ ๋น„๊ตํ•˜๊ณ , ์ฒซ ๋ฒˆ์งธ ๋‹ค๋ฅธ ๋ฐ”์ดํŠธ์˜ ์œ„์น˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, 7๋ฒˆ์งธ ์œ„์น˜์— ํ•ด๋‹นํ•˜๋Š” ๊ณต๋ฐฑ ๋ฌธ์ž์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‘ ํŒŒ์ผ์˜ ๋‚ด์šฉ์—์„œ 7๋ฒˆ์งธ ์œ„์น˜๋ถ€ํ„ฐ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

Java 13

TextBlocks

Text Blocks๋Š” Java 13์— preview ๊ธฐ๋Šฅ์œผ๋กœ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, Java 15์—์„œ ์ •์‹์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ๋ฌธ์ž์—ด์˜ ์—ฐ๊ฒฐ์ด๋‚˜ 

์ด์Šค์ผ€์ดํ”„ ๋ฌธ์ž ์—†์ด ์—ฌ๋Ÿฌ ์ค„์— ๊ฑธ์ณ ์žˆ๋Š” ๋ฌธ์ž์—ด์„ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Text Blocks๋Š” SQL ์ฟผ๋ฆฌ, JSON, XML, ๊ฐ€๋…์„ฑ์ด ์ค‘์š”ํ•œ ๋‹ค๋ฅธ ํฌ๋งทํ˜•์‹์˜ ํ…์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

Java 14

Yield Keyword

Java 12์—์„œ ์Šค์œ„์น˜ ๋ฌธ์— ์‹์„ ๋„์ž…ํ•˜์—ฌ previw ๊ธฐ๋Šฅ์œผ๋กœ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. Java 13์—์„œ๋Š” ์Šค์œ„์น˜ ๋ฌธ์—์„œ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด yield constructor ๋ฅผ ์ถ”๊ฐ€ํ–ˆ๊ณ , ์ด์ œ Java 14์—์„œ๋Š” ์Šค์œ„์น˜ ์‹์„ ํ‘œ์ค€ ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Java 15

Garbage Collector Updates

Z ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๋Š” Java 15 ์ด์ „๊นŒ์ง€๋Š” ์‹คํ—˜์ ์ธ ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€์—ฐ ์‹œ๊ฐ„์ด ์งง๊ณ , ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚œ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ์ž…๋‹ˆ๋‹ค.

 

ZGC๋Š” ๊ฐœ๋ฐœ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ๋„ˆ๋ฌด๋‚˜๋„ ๊ฑฐ๋Œ€ํ•ด์„œ ์กฐ๊ธฐ์— ์ถœ์‹œํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋Š๋ผ๋ฉด์„œ ์‹คํ—˜ ๊ธฐ๋Šฅ์œผ๋กœ Java 11์— ๋„์ž…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์—์„œ ๋งŽ์€ ๋ถ€๋ถ„ ๊ฐœ์„ ์ด ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

 

ZGC๋Š” ๊ณ ์„ฑ๋Šฅ์ด๋ฉฐ, ๋จธ์‹  ๋Ÿฌ๋‹ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๊ฐ™์€ ๋Œ€๊ทœ๋ชจ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ฒฝ์šฐ์—๋„ ํšจ์œจ์ ์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ์žฅ์‹œ๊ฐ„ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ์ผ(STW??)์ด ์—†๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. Linux, Windows, MacOS๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

 

Shenandoah(?)์˜ ์ผ์‹œ ์ค‘์ง€ ์‹œ๊ฐ„์˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ๊ฐ€ ์‹คํ—˜ ๋‹จ๊ณ„์—์„œ ๋ฒ—์–ด๋‚ฌ์Šต๋‹ˆ๋‹ค. JDK 12์—์„œ ๋„์ž…๋˜์—ˆ์œผ๋ฉฐ, Java 15 ์ดํ›„๋ถ€ํ„ฐ๋Š” ํ‘œ์ค€ JDK์˜ ์ผ๋ถ€๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

 

Java 16

Pattern Matching for instanceof

Java 14์—์„œ preview ๊ธฐ๋Šฅ์œผ๋กœ type test pattern(?)์„ ๊ฐ€์ง€๋Š” instanceof ์—ฐ์‚ฐ์ž๋ฅผ ์†Œ๊ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. Type test pattern์€ ๋‹จ์ผ ๋ฐ”์ธ๋”ฉ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ์œ ํ˜•์„ ์ง€์ •ํ•˜๋Š” predicate๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ Java 15์—์„œ๋„ ๊ณ„์† preview ๊ธฐ๋Šฅ์œผ๋กœ ์‚ฌ์šฉ๋˜์—ˆ๊ณ , Java 16์—์„œ๋Š” ํ‘œ์ค€ ๋ฆด๋ฆฌ์ฆˆ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 

Records

Java 14๋Š” ๋ถˆ๋ณ€์˜ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก preview ๊ธฐ๋Šฅ์œผ๋กœ ์ƒˆ๋กœ์šด ํด๋ž˜์Šค ํƒ€์ž…์ธ record๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. 

Java 15๋Š” recore ์œ ํ˜•์„ ๋”์šฑ ๊ฐœ์„ ํ–ˆ๊ณ , Java 16์—์„œ๋Š” record๊ฐ€ JDK์˜ ํ‘œ์ค€ ๊ธฐ๋Šฅ์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. record๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ„๊ฒฐํ•œ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

 

 

Java 17

Sealed Class

Sealed ํด๋ž˜์Šค๋Š” ํด๋ž˜์Šค ์ƒ์†์— ๋Œ€ํ•œ ํ†ต์ œ๊ถŒ์„ ๊ฐ•ํ™”ํ•˜๊ณ , ํŠน์ • ํ•˜์œ„ ํด๋ž˜์Šค๋งŒ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž๋ฐ” 15์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. 

์ด ๊ธฐ๋Šฅ์€ sealed ํด๋ž˜์Šค์—์„œ ์ƒ์†์ด ํ—ˆ์šฉ๋˜๋Š” ์ œํ•œ๋œ ํด๋ž˜์Šค ์ง‘ํ•ฉ์„ ์„ ์–ธํ•˜๋Š” ๋™์‹œ์— ๋‹ค๋ฅธ ํด๋ž˜์Šค๋“ค์€ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” Sealed ํด๋ž˜์Šค์˜ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

์ด ์˜ˆ์ œ์—์„œ Shape ํด๋ž˜์Šค๋Š” sealed ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ์–ธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. permits ํ‚ค์›Œ๋“œ๋Š” Shape ํด๋ž˜์Šค๋กœ๋ถ€ํ„ฐ ์ƒ์†ํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ์ง€์ •ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

 

์ด ์˜ˆ์ œ์—์„œ Circle, Rectangle, Triangle, Square ํด๋ž˜์Šค๋Š” Shape์˜ ํ—ˆ์šฉ๋˜๋Š” ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. Square ํด๋ž˜์Šค๋Š” non-sealed๋กœ ์„ ์–ธ๋˜๋ฏ€๋กœ, ๋ถˆ๋ณ€์ด ์•„๋‹ˆ๊ณ  ํ˜„์žฌ ํŒจํ‚ค์ง€ ์™ธ๋ถ€์˜ ํด๋ž˜์Šค์— ์˜ํ•ด ์ถ”๊ฐ€๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Sealed ํด๋ž˜์Šค์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

  • Controlled Inheritance: Sealed ํด๋ž˜์Šค๋Š” ์–ด๋Š ํด๋ž˜์Šค๊ฐ€ ์ƒ์†์ด ๊ฐ€๋Šฅํ•œ์ง€, ์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์˜ˆ์ƒํ•˜์ง€ ์•Š์€ ํ•˜์œ„ ํด๋ž˜์Šค๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Limited Subclasses: pertmis ํ‚ค์›Œ๋“œ๋Š” sealed ํด๋ž˜์Šค์˜ ์ง์ ‘์ ์ธ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Open and Non-Sealed: Sealed ํด๋ž˜์Šค๋Š” ๊ฐœ๋ฐฉํ˜• ๋˜๋Š” non-sealed ํด๋ž˜์Šค๋ฅผ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์–ด ํด๋ž˜์Šค ๊ณ„์ธต ๊ตฌ์กฐ์— ๋” ๋งŽ์€ ์œ ์—ฐ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • Final by Default: Sealed ํด๋ž˜์Šค๋Š” ๋ถˆ๋ณ€์ด๋ฏ€๋กœ, ๋ช…์‹œ์ ์œผ๋กœ ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š” ํ•œ ์ง์ ‘ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ฑฐ๋‚˜ ํ•˜์œ„ ํด๋ž˜์Šค๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  • Use Cases: Sealed ํด๋ž˜์Šค๋Š” ํ•˜์œ„ ํด๋ž˜์Šค์˜ ์ˆ˜๋ฅผ ์ œํ•œํ•˜๊ฑฐ๋‚˜, ๋ณด๋‹ค ๋‚˜์€ ํด๋ž˜์Šค ๊ณ„์ธต์˜ ์„ค๊ณ„ ๋ฐ ๋™์ž‘์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

 

 

Java 21

Virtual Threads

์ด์ „ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„œ Java์˜ ์Šค๋ ˆ๋“œ๋Š” OS(์šด์˜์ฒด์ œ) ์Šค๋ ˆ๋“œ์™€ ์ง์ ‘์ ์œผ๋กœ ์ผ์น˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, OS ์ œ์•ฝ์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ์Šค๋ ˆ๋“œ ์ˆ˜์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ „ํ†ต์ ์ธ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์—์„œ๋Š” ๊ณผ๋„ํ•œ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์œผ๋กœ ์ธํ•ด OS์— ๋ถ€๋‹ด์„ ์ฃผ๊ณ , ํŠนํžˆ ์ˆ˜๋ช…์ด ์งง์€ ์Šค๋ ˆ๋“œ์˜ ๊ฒฝ์šฐ ๋†’์€ ๋น„์šฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Java 21์€ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ์™€ OS ์Šค๋ ˆ๋“œ ๊ฐ„์˜ ๋งคํ•‘์„ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ์ด๋ก ์ ์œผ๋กœ ๋ฌด์ œํ•œ์˜ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํ˜์‹ ์€ ๊ธฐ์กด์˜ ์Šค๋ ˆ๋“œ ๋ชจ๋ธ์˜ ํ•œ๊ณ„๋ฅผ ํ•ด๊ฒฐํ•˜์—ฌ ์ฒ˜๋ฆฌ๋Ÿ‰์ด ๋งŽ์€ ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•˜๋Š” ์ˆ˜๋งŽ์€ ์Šค๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๋ ˆ๋“œ ์ƒ์„ฑ์— ๋Œ€ํ•œ ์ด์ „์˜ ์ œ์•ฝ์ด ์ œ๊ฑฐ๋˜์–ด ์„œ๋ฒ„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์š”์ฒญ๋‹น ์Šค๋ ˆ๋“œ ์Šคํƒ€์ผ(Thread-Per-Request)์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์˜ˆ์‹œ๋Š” OS/ํ”Œ๋žซํผ ์Šค๋ ˆ๋“œ์™€ ๋น„๊ตํ•˜์—ฌ ๊ฐ€์ƒ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ž‘์—…๋‹น 50๋งŒ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ExecutorService๋ฅผ ํ™œ์šฉํ•จ์œผ๋กœ์จ, JDK๋Š” ์ œํ•œ๋œ ์ˆ˜์˜ ์บ๋ฆฌ์–ด ๋ฐ OS ์Šค๋ ˆ๋“œ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™์‹œ์„ฑ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

 

Sequenced Collections

๋ช…์‹œ๋œ ์ˆœ์„œ๋ฅผ ๊ฐ€์ง„ ์ปฌ๋ ‰์…˜์˜ ๋ฒ”์šฉ์ ์ธ ์Šˆํผ ํƒ€์ž…(supertype)์˜ ๋ถ€์žฌ๋กœ ์ธํ•ด Java์˜ ์ปฌ๋ ‰์…˜ ํ”„๋ ˆ์ž„์›Œํฌ ๋‚ด์—์„œ ๋ฐ˜๋ณต์ ์ธ ์ด์Šˆ์™€ ๋ถˆ๋งŒ์ด ๋ฐœ์ƒํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์™€ ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ์ ‘๊ทผํ•˜๊ณ , ์—ญ์ˆœ์œผ๋กœ ๋ฐ˜๋ณตํ•˜๋Š” ์ผ๊ด€์ ์ธ ๋ฉ”์„œ๋“œ๊ฐ€ ์—†๋‹ค๋Š” ์ ๋„ ์ง€์†์ ์ธ ๋‹จ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ˆœ์„œ๋ฅผ ์œ ์ง€ํ•˜๋Š” List ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ์ฒซ ๋ฒˆ์งธ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์€ list.get(0)์œผ๋กœ ๊ฐ„๋‹จํ•˜์ง€๋งŒ, ๋งˆ์ง€๋ง‰ ์š”์†Œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด list.get(list.size() - 1)์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ถˆ์ผ์น˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง๋ฉดํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•˜๊ณ  ์ฝ”๋“œ์˜ ์œ ์ง€ ๊ด€๋ฆฌ๋ฅผ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

 

๋น„๋ก ์ด๋Ÿฌํ•œ ๋ถˆํŽธํ•จ์€ Collection ์ธํ„ฐํŽ˜์ด์Šค์˜ ์˜ˆ๋กœ ์–ธ๊ธ‰๋˜์—ˆ์ง€๋งŒ, Map ์ธํ„ฐํŽ˜์ด์Šค์—์„œ๋„ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

 

์ด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์€ ๊ธฐ์กด ์ปฌ๋ ‰์…˜ ๊ณ„์ธต์— ์ถ”๊ฐ€๋˜๋Š” ์ˆœ์ฐจ์ ์ธ maps, sets, collections์„ ์œ„ํ•œ ์„ธ ๊ฐ€์ง€ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋„์ž…ํ•ฉ๋‹ˆ๋‹ค.

 

JEP 431: Sequenced Collections

 

SequencedCollection ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์ฒ˜์Œ๊ณผ ๋งˆ์ง€๋ง‰ ์š”์†Œ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ญ์ˆœ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ SequencedMap, SequencedSet ์ธํ„ฐํŽ˜์ด์Šค๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Sequenced Collections์˜ ๋„์ž…์€ ์ž๋ฐ” ์ปฌ๋ ‰์…˜์˜ ์ฃผ๋ชฉํ•  ๋งŒํ•œ ๋ฐœ์ „์ž…๋‹ˆ๋‹ค. ํŠน์ • ์ˆœ์„œ๋กœ ์ปฌ๋ ‰์…˜์„ ๊ด€๋ฆฌํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ์ ‘๊ทผ ๋ฐฉ์‹์— ๋Œ€ํ•œ ์˜ค๋žœ ์š”๊ตฌ ์‚ฌํ•ญ์„ ์ถฉ์กฑํ•จ์œผ๋กœ์จ, Java๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋” ๋†’์€ ํšจ์œจ์„ฑ๊ณผ ๋ช…ํ™•์„ฑ์œผ๋กœ ์šด์˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๋ณด๋‹ค ํˆฌ๋ช…ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ๋™์ž‘์„ ํ™•๋ฆฝํ•˜์—ฌ, ์ฝ”๋“œ๋ฅผ ๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ์ด๋•๋‹ˆ๋‹ค.

 

String Templates

JDK 21์˜ preview ๊ธฐ๋Šฅ์œผ๋กœ ๋„์ž…๋œ String Templates๋Š” ์ž๋ฐ”์—์„œ ๋ฌธ์ž์—ด ์กฐ์ž‘์˜ ์‹ ๋ขฐ์„ฑ๊ณผ ์‚ฌ์šฉ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด๋กœ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋Š” ํ…œํ”Œ๋ฆฟ ํ‘œํ˜„์‹์„ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์€ ์˜๋„ํ•˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ธ์ ์…˜๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. String Templates๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฌธ์ž์—ด ํ…œํ”Œ๋ฆฟ ๋‚ด์— ์‹์„ ์ž‘์„ฑํ•˜๊ณ  ์›ํ•˜๋Š” ์ถœ๋ ฅ๋ฌผ์„ ์‰ฝ๊ฒŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

Record Patterns

์ž๋ฐ” 14์—์„œ Record์˜ ๋„์ž…์€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ ์—†์ด ๋ฐ์ดํ„ฐ ์ „์†ก์—๋งŒ ์ง‘์ค‘ํ•˜๋ฉด์„œ ๋ฐ์ดํ„ฐ ์ค‘์‹ฌ ํด๋ž˜์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฝ”๋“œ๋ฅผ ๊ฐ„์†Œํ™”ํ•˜๊ณ  ๊ฐ€๋…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์ค‘์š”ํ•œ ์ง„์ „์ด์—ˆ์Šต๋‹ˆ๋‹ค.

 

์ด์ œ Java 21์˜ ๋ฐœ์ „์œผ๋กœ ๋ ˆ์ฝ”๋“œ ํŒจํ„ด๊ณผ ํƒ€์ž… ํŒจํ„ด์„ ์ค‘์ฒฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์— ๋Œ€ํ•œ ๋ณด๋‹ค ์„ ์–ธ์ ์ด๊ณ  ๊ตฌ์„ฑ ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด๋‹ค ์ง๊ด€์ ์ด๊ณ  ๊ฐ„๊ฒฐํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

Java 21 ์ด์ „์—๋Š”, ๋ ˆ์ฝ”๋“œ์—์„œ ๊ฐœ๋ณ„ ๊ฐ’์— ์ ‘๊ทผํ•˜๋ ค๋ฉด ์ „์ฒด ๋ ˆ์ฝ”๋“œ๋ฅผ ํ•ด์ฒดํ•ด์•ผ ํ–ˆ๊ณ , ์ด๋Š” ์žฅํ™ฉํ•œ ์ฝ”๋“œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ๋ ˆ์ฝ”๋“œ ํŒจํ„ด๊ณผ ํƒ€์ž… ํŒจํ„ด์ด ๋„์ž…๋˜๋ฉด์„œ ์ด๋Ÿฌํ•œ ๊ณผ์ •์€ ํ›จ์”ฌ ๋” ๊ฐ„๋‹จํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค.

 

์•„๋ž˜ ์˜ˆ์ œ๋ฅผ ํ†ตํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Java 21 ์ด์ „์˜ printCityWithoutPatternMatching() ๋ฉ”์„œ๋“œ์—์„œ๋Š” ๊ฐ์ฒด๊ฐ€ Address์˜ ์ธ์Šคํ„ด์Šค์ธ์ง€ ๋จผ์ € ํ™•์ธํ•œ ๋‹ค์Œ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด city๋ฅผ ๊ฒ€์ƒ‰ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ž‘๋™์€ ํ•˜์ง€๋งŒ ์žฅํ™ฉํ•˜๊ณ  ์ง๊ด€์ ์ด์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋Œ€์กฐ์ ์œผ๋กœ, printCityWithPatternMatching() ๋ฉ”์„œ๋“œ๋Š” Java 21์— ๋„์ž…๋œ ํŒจํ„ด ๋งค์นญ์˜ ๊ฐ•๋ ฅํ•จ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ check๋ฅผ ์œ„ํ•œ Instanceof๋Š” ์กฐ๊ฑด๋ฌธ์—์„œ ์ง์ ‘ ํŒจํ„ด ๋งค์นญ๊ณผ ๊ฒฐํ•ฉ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋ช…์‹œ์ ์ธ ์ ‘๊ทผ์ž ๋ฉ”์„œ๋“œ ์—†์ด๋„ ๊ฐ์ฒด์—์„œ ์ง์ ‘ city๋ฅผ ์ถ”์ถœํ•˜๋Š” ๋” ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๊ฒฐํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

 

์ „๋ฐ˜์ ์œผ๋กœ, ํŠนํžˆ ๋ ˆ์ฝ”๋“œ ํŒจํ„ด๊ณผ ํƒ€์ž… ํŒจํ„ด์˜ ๋„์ž…์œผ๋กœ ์ธํ•ด Java 21์˜ ๋ฐœ์ „์€ ๋ฐ์ดํ„ฐ ์กฐ์ž‘์„ ๋”์šฑ ๋‹จ์ˆœํ™”ํ•˜๊ณ  ๋ณด๋‹ค ์šฐ์•„ํ•˜๊ณ , ๊ฐ€๋…์„ฑ์ด ์ข‹์€ ์ฝ”๋“œ์— ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์— ๊ฐ‡ํžˆ์ง€ ์•Š๊ณ  ํ”„๋กœ๊ทธ๋žจ์˜ ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.

 

 

Conclusion

์š”์•ฝํ•˜์ž๋ฉด, Java 8๋ถ€ํ„ฐ 21๊นŒ์ง€์˜ ๋ณ€ํ™” ๊ณผ์ •๋“ค์€ ์ด ์–ธ์–ด๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐœ์ „ํ•ด ์™”๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์‹, ์ƒˆ๋กœ์šด Time API, ์ŠคํŠธ๋ฆผ API, Sealed class, records ๋“ฑ ๋ฉ‹์ง„ ๊ธฐ๋Šฅ๋“ค์„ ๋งŽ์ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ํ†ตํ•ด Java๋Š” ์ฝ”๋”ฉ์—์„œ ์ตœ์‹  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ด๋Ÿฌํ•œ ์ƒˆ๋กœ์šด ์ง€์‹์œผ๋กœ ๋ฌด์žฅํ•œ ๋‹น์‹ ์€ ์ž์‹  ์žˆ๊ฒŒ ์ฝ”๋”ฉ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Java๋Š” ํ•ญ์ƒ ๋ณ€ํ™”ํ•˜๊ณ  ์„ฑ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—…๋ฐ์ดํŠธ๋ฅผ ๋”ฐ๋ผ๊ฐ„๋‹ค๋ฉด, ๋” ๋งŽ์€ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”. ์ฝ”๋”ฉ์„ ์ฒ˜์Œ ํ•˜๋“  ํ”„๋กœ์ด๋“ , Java๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์•„์ด๋””์–ด๋Š” Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ์„ธ๊ณ„๋กœ ๋›ฐ์–ด๋“ค๋„๋ก ์—ฌ๋Ÿฌ๋ถ„์„ ์•ˆ๋‚ดํ•ฉ๋‹ˆ๋‹ค. Happy coding!

 

 

์ •๋ฆฌ

ํ™•์‹คํžˆ Java 8์— ๊ต‰์žฅํžˆ ๋งŽ์€ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๊ณ , ๊ต‰์žฅํžˆ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜์ธ Optional์ด ํฌ์ŠคํŒ…์— ์—†๋Š” ๊ฑด ์กฐ๊ธˆ ์•„์‰ฝ๋„ค์š”. 

 

๊ทธ ์™ธ Java 9์˜ Try-with-resources, Java 10์˜ var ํ‚ค์›Œ๋“œ, Java 13์˜ TextBlocks, Java 16์˜ Records๋„ ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค์ž…๋‹ˆ๋‹ค.

 

Java 21์— ๋„์ž…๋œ Sequenced Collections, String Templates๋Š” ๊ต‰์žฅํžˆ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํŠน์ • message๋ฅผ ๋งŒ๋“ค ๋•Œ String.format()์„ ๋งŽ์ด ์‚ฌ์šฉํ•ด์™”๋Š”๋ฐ String Templates๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ตณ์ด format์€ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์–ด๋ณด์ด๊ณ , ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ์กด์žฌํ•˜๋Š” ๊ธฐ๋Šฅ์ธ๋ฐ Java์—๋Š” ๊ฝค๋‚˜ ๋Šฆ๊ฒŒ(?) ๋„์ž…์ด ๋œ ๊ฒƒ ๊ฐ™๋„ค์š”.. ์•ž์œผ๋กœ๋Š” ๊ฐ€๋Šฅํ•˜๋ฉด Java 21 ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœ์„ ํ•ด๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

 

 

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€