[Java] Java 21 특징

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