본문 바로가기
Language/Java

[Java] Java 버전별 특징 : Java 19~21 [1]( Sequenced Collection, Record Patterns )

by 계범 2024. 10. 19.

Java 19~21

Java 19, 20, 비(非) LTS 버전으로, 다양한 새로운 기능과 성능 최적화를 제공하며 자바의 동시성 처리, 패턴 매칭, 네이티브 코드 상호작용, 그리고 문자열 처리 등을 대폭 개선했습니다.

 

19,20에서 preview로 했던 기능들이 21에서 LTS버전으로 정식출시되었습니다.

Virtual Thread, Structured Concurrency, Scoped Values 등의 동시성 처리 및 성능 최적화 이슈들.

Sequenced Collections, Record Patterns 등을 통해 보다 코드가 간결해졌습니다.

 

Sequenced Collections

Sequenced Collections는 Java 21에 도입된 새로운 인터페이스로, 순서가 있는 컬렉션에서 처음과 마지막 요소를 쉽게 다룰 수 있는 메서드를 제공합니다. 이 인터페이스는 List, Set, Map과 같은 기존 컬렉션에 적용되며, 데이터를 삽입 순서정렬된 순서에 따라 관리하는 데 유용합니다.

 

더보기
더보기
package java_version_feature;

import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.SequencedCollection;
import java.util.SequencedMap;
import java.util.SequencedSet;

public class Java21_sequenced_collection {
    public static void main(String[] args) {
//        testSequncedCollection();
//        testSequncedMap();
        testSequncedSet();
    }

    private static void testSequncedSet() {
        // LinkedHashSet은 SequencedSet 인터페이스를 구현함
        SequencedSet<String> sequencedSet = new LinkedHashSet<>();

        // Set에 요소 추가
        sequencedSet.add("A");
        sequencedSet.add("B");
        sequencedSet.add("C");
        sequencedSet.addFirst("A-");
        sequencedSet.addLast("D");

        // 첫 번째와 마지막 요소 확인
        System.out.println("첫 번째 요소: " + sequencedSet.getFirst()); // A
        System.out.println("마지막 요소: " + sequencedSet.getLast());   // C

        // 첫 번째와 마지막 요소 제거
        sequencedSet.removeFirst();
        sequencedSet.removeLast();

        // 변경된 Set 출력
        System.out.println("변경된 Set: " + sequencedSet);  // B만 남음

    }

    private static void testSequncedMap() {
        // LinkedHashMap은 SequencedMap 인터페이스를 구현함
        SequencedMap<Integer, String> sequencedMap = new LinkedHashMap<>();

        // 요소 추가 (삽입 순서 유지됨)
        sequencedMap.put(2, "Two");
        sequencedMap.putLast(3, "Three");
        sequencedMap.putFirst(1, "One");

        // 첫 번째와 마지막 요소 확인
        System.out.println("첫 번째 요소: " + sequencedMap.firstEntry()); // 1=One
        System.out.println("마지막 요소: " + sequencedMap.lastEntry());   // 3=Three
        System.out.println("전체 요소: " + sequencedMap);


        // 첫 번째와 마지막 요소 꺼내기
        System.out.println("첫 번째 요소: " + sequencedMap.pollFirstEntry()); // 1=One
        System.out.println("마지막 요소: " + sequencedMap.pollLastEntry());   // 3=Three

        // 변경된 Map 출력
        System.out.println("변경된 Map: " + sequencedMap);
    }

    private static void testSequncedCollection() {
        // LinkedList는 SequencedCollection 인터페이스를 구현함
        SequencedCollection<String> sequencedList = new LinkedList<>();

        // 리스트의 앞과 뒤에 요소를 추가
        sequencedList.addFirst("First Element");
        sequencedList.addLast("Last Element");

        // 첫 번째와 마지막 요소 출력
        System.out.println("첫 번째 요소: " + sequencedList.getFirst());  // First Element
        System.out.println("마지막 요소: " + sequencedList.getLast());    // Last Element

        // 요소 추가
        sequencedList.addFirst("new First Element");
        sequencedList.addLast("New Last Element");

        // 첫 번째와 마지막 요소 확인
        System.out.println("첫 번째 요소: " + sequencedList.getFirst());  // First Element
        System.out.println("마지막 요소: " + sequencedList.getLast());    // New Last Element

        // 리스트의 모든 요소 출력
        System.out.println("전체 요소: " + sequencedList);

        // 첫 번째와 마지막 요소 제거
        sequencedList.removeFirst();
        System.out.println("변경된 요소: " + sequencedList);
        sequencedList.removeLast();
        System.out.println("변경된 요소: " + sequencedList);
    }
}

 

Record Pattern

Java 14부터 도입된 Record의 Pattern 매칭 기능이 더 강력해짐.

(Java 14 글 https://cano721.tistory.com/235)

 

package java_version_feature;

public class Java21_record_pattern {
    public static void main(String[] args) {
        Point p = new Point(10, 20);

        // 패턴 매칭을 통한 레코드 분해
        if (p instanceof Point(int x, int y)) {
            System.out.println("x: " + x + ", y: " + y);
        }

        switch (p) {
            case Point(int x, int y) -> System.out.println("Point with x: " + x + ", y: " + y);
            default -> System.out.println("Unknown");
        }

        if (p instanceof Point(int x, int y) && x > 5 && y < 25) {
            System.out.println("x is greater than 5 and y is less than 25");
        } else {
            System.out.println("Point does not match the criteria");
        }

        // 중첩된 레코드 생성
        Line line = new Line(new Point(0, 0), new Point(10, 20));

        // 중첩된 레코드에 대한 패턴 매칭
        if (line instanceof Line(Point(int x1, int y1), Point(int x2, int y2))) {
            System.out.println("Start point: (" + x1 + ", " + y1 + ")");
            System.out.println("End point: (" + x2 + ", " + y2 + ")");
        }

    }

    public record Point(int x, int y) {}

    // 레코드 중첩 정의
    public record Line(Point start, Point end) {}
}

 

댓글