Java 21
- 2023년 9월 19일 정식 출시
- 최소 8년 간의 장기 지원
- Spring Boot 3.2.x, Spring Framework 6.0.x, 6.1.x
Java 21 을 선택한 이유
- Spring Boot 3.0 버전부터는 java 17 이상을 지원합니다.
- Virtual Thread의 도입으로 인한 성능 비교를 위하여 선택하였습니다.
추가된 기능
1. Sequenced Collections
- 일련의 순서를 갖는 collection에서 사용되는 연산들을 일관된 형식으로 제공하고자 새로운 interface를 도입하였습니다.
- 정렬과 역정렬에 대한 표준화된 API를 제공합니다.

- SequencedCollection: 양쪽 끝에서 공통 작업을 지원하며, 정렬과 역정렬을 지원합니다.
interface SequencedCollection<E> extends Collection<E> {
// new method
SequencedCollection<E> reversed();
// methods promoted from Deque
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
}
- SequencedSet: Set에 대한 역정렬을 지원합니다.
interface SequencedSet<E> extends Set<E>, SequencedCollection<E> {
SequencedSet<E> reversed(); // covariant override
}
- SequencedMap: Map에 대한 정렬된 Key, Value, EntrySet 값을 제공하고, 양쪽 끝에서 삽입, 역정렬을 지원합니다.
interface SequencedMap<K,V> extends Map<K,V> {
// new methods
SequencedMap<K,V> reversed();
SequencedSet<K> sequencedKeySet();
SequencedCollection<V> sequencedValues();
SequencedSet<Entry<K,V>> sequencedEntrySet();
V putFirst(K, V);
V putLast(K, V);
// methods promoted from NavigableMap
Entry<K, V> firstEntry();
Entry<K, V> lastEntry();
Entry<K, V> pollFirstEntry();
Entry<K, V> pollLastEntry();
}
2. Virtual Thread
- JDK 21에서 공식적으로 추가되었습니다.
[Java] Virtual Thread
[Java] Virtual Thread우아한 테크 세미나 [Java의 미래, Virtual Thread]를 보고 정리한 내용입니다.2018년 Project Loom으로 시작된 경량 스레드 모델2023년 JDK 21에 정식 feature로 포함장점1. 스레드 생성 및 스
ss0510s.tistory.com
[Spring Boot] Virtual Thread 적용
스프링 부트에서 가상 스레드를 지원하기 위한 작업가상 스레드 사용 여부 프로퍼티 추가spring-boot-autoconfigure 모듈의 spring-configuration-metadata.json에 가상 스레드를 지원하기 위한 프로퍼티가 추가
ss0510s.tistory.com
3. Record Patterns
- 레코드에 타입 패턴을 적용하여 레코드에서 데이터를 더 쉽게 추출할 수 있습니다.
- Java 16에서는 instance of 연산자에 타입 패턴을 적용하여 개선하였습니다.
// As of Java 16
record Point(int x, int y) {}
static void printSum(Object obj) {
if (obj instanceof Point p) {
int x = p.x();
int y = p.y();
System.out.println(x+y);
}
}
- Java 21 부터는 obj가 Point의 인스턴스인지 여부를 확인하고, 접근자 메소드를 호출하여 직접 변수에 접근할 수 있게 합니다.
// As of Java 21
static void printSum(Object obj) {
if (obj instanceof Point(int x, int y)) {
System.out.println(x+y);
}
}
- 중첩된 레코드를 쉽게 분해할 수 있습니다.
4. Pattern Matching for switch
- Java17에서 preview였던 Pattern Matching을 사용할 수 있습니다.
- switch문으로 Pattern Matching을 확장함에 따라 복잡한 데이터 지향 쿼리를 간결하고 안전하게 표현할 수 있습니다.
- case문에 null을 허용합니다.
// Prior to Java 21
static String formatter(Object obj) {
String formatted = "unknown";
if (obj instanceof Integer i) {
formatted = String.format("int %d", i);
} else if (obj instanceof Long l) {
formatted = String.format("long %d", l);
} else if (obj instanceof Double d) {
formatted = String.format("double %f", d);
} else if (obj instanceof String s) {
formatted = String.format("String %s", s);
}
return formatted;
}
// As of Java 21
static String formatterPatternSwitch(Object obj) {
return switch (obj) {
case null -> "null";
case Integer i -> String.format("int %d", i);
case Long l -> String.format("long %d", l);
case Double d -> String.format("double %f", d);
case String s -> String.format("String %s", s);
default -> obj.toString();
};
}
'BackEnd > Java' 카테고리의 다른 글
| [Java] Java 17 특징 (0) | 2024.06.24 |
|---|---|
| [Java] Java 11 특징 (0) | 2024.06.21 |
| [Java] Java 8 특징 (0) | 2024.06.21 |
| [Java] Virtual Thread (0) | 2024.06.06 |