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) {}
}
'Language > Java' 카테고리의 다른 글
[Java] Java 버전별 특징 : Java 18 ( Simple Web Server, Default UTF-8, Code Snippets ) (1) | 2024.10.10 |
---|---|
[Java] Java 버전별 특징 : Java 16~17 (1) | 2024.10.09 |
[Java] Java 버전별 특징 : Java 15 (sealed class, hidden classes) (1) | 2024.10.08 |
[Java] Java 버전별 특징 : Java 14 (Record, instanceof 개선, NPE 개선) (0) | 2024.10.06 |
[Java] Java 버전별 특징 : Java 13 (Text Blocks, Dynamic CDS Archives, ZGC 개선) (0) | 2024.10.06 |
댓글