ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java 22 신규 및 변경 기능
    Java/Java25 2025. 12. 14. 11:32

     

    JEP 456: Unnamed Variables & Patterns

    https://openjdk.org/jeps/456

    이름 없는 변수 및 패턴

    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)

    https://openjdk.org/jeps/447

    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

    댓글

Designed by Tistory.