-
Java 22 신규 및 변경 기능Java/Java25 2025. 12. 14. 11:32
JEP 456: Unnamed Variables & Patterns
이름 없는 변수 및 패턴
status : Closed/Delivered
사용하지 않는 변수나 패턴을 명시적으로 이름을 지정하지 않고 _ (밑줄)로 대체하여 코드를 더 깔끔하고 명확하게 만들 수 있습니다.
// 기존 코드 (e는 사용되지 않음) try { Integer.parseInt("hello"); } catch (NumberFormatException e) { // 예외 타입만 중요하고, 변수 e는 사용되지 않음 System.out.println("숫자 포맷 오류 발생"); } // Java22 이후, exception 을 사용하지 않을 때 이름 없는 변수 _ 사용 try { Integer.parseInt("hello"); } catch (NumberFormatException _) { // 변수를 선언할 필요 없이 _로 무시 System.out.println("숫자 포맷 오류 발생"); }// 기존 코드 order 는 사용되지 않음 for (Order order : orders) { totalCount++; } // Java22 (order 변수가 사용되지 않을 때, _ 로 ) for (Order _ : orders) { totalCount++; }// 기존 코드 Stream.of(1, 2, 3) .forEach((index, value) -> System.out.println("값: " + value)); // 람다 표현식에서 사용되지 않는 매개변수 index 를 _ 로 Stream.of(1, 2, 3) .forEach((_, value) -> System.out.println("값: " + value)); // 첫 번째 매개변수(index)는 사용하지 않음JEP 447: Statements before super(...) (Preview)
preview
생성자 내부에서 super(...) 또는 this(...) 호출이 반드시 생성자 몸체의 첫 번째 문장이어야 했습니다.
하지만, Java22 부터 생성자 본문에서 super(...) 또는 this(...) 호출 전에 명령문을 허용합니다.
유효성검사, 인수 계산, 지역 변수 선언 및 할당 등 유연하게 적용 가능합니다
// 예1, 변경 전 super(value) 가 첫 번째 여야함 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { super(value); // value가 유효하지 않아도 슈퍼클래스 생성자 실행됨 if (value <= 0) throw new IllegalArgumentException("non-positive value"); } } // 예2, 유효성 검사를 별도 메소드로 작성하여, 우회 해야 했음 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { super(verifyPositive(value)); } private static long verifyPositive(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); return value; } }// Java22 이후, super(value) 전에 유효성 검사 가능 public class PositiveBigInteger extends BigInteger { public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); } }JEP 461: Stream Gatherers (Preview)
preview(22) : https://openjdk.org/jeps/461
2nd preview(23) : https://openjdk.org/jeps/473
final(24) : https://openjdk.org/jeps/485
java.util.stream.Stream에 새로운 중간 연산인 gather(Gatherer)가 추가되어 개발자가 사용자 정의 중간 스트림 작업을 만들 수 있습니다.
이는 기존의 map, filter, flatMap 등으로 표현하기 어려웠던 복잡한 변환(예: 스트림 요소를 그룹화하거나 창(window) 단위로 처리)을 더 쉽게 구현할 수 있게 해줍니다.
// Gatherer를 사용하여 스트림의 요소를 2개씩 쌍으로 묶는 예 List<String> list = List.of("A", "B", "C", "D", "E"); List<List<String>> pairs = list.stream() .gather(Gatherers.window(2)) .toList(); // 결과: [["A", "B"], ["C", "D"], ["E"]] (마지막 요소는 하나만 남음)distinctBy(String::length) 대체
// gather 사용 var result = Stream.of("foo", "bar", "baz", "quux") .gather(distinctBy(String::length)) .toList(); // 결과: [foo, quux] (또는 첫 등장 기준으로 [bar, quux] 등) 기존 record DistinctByLength(String str) { @Override public boolean equals(Object obj) { return obj instanceof DistinctByLength(String other) && str.length() == other.length(); } @Override public int hashCode() { return Integer.hashCode(str.length()); } } var result = Stream.of("foo", "bar", "baz", "quux") .map(DistinctByLength::new) .distinct() .map(DistinctByLength::str) .toList(); // result ==> [foo, quux]JEP 464 Scoped Values
https://ride-wind.tistory.com/155
ETC
JEP 454 : Foreign Function & Memory API
Final
JNI 없이 C/C++ Native Library 호출
안전한 메모리 접근 (off-heap)
'Java > Java25' 카테고리의 다른 글
Java 25 Performance Improvement (0) 2025.12.21 JEP 513 Flexible Constructor Bodies (0) 2025.12.20 JEP 512 Compact Source File & Instance Main Method (0) 2025.12.20 JEP 506 Scoped Values (0) 2025.12.16 Java 25 new features (0) 2025.10.27