[Java] Java 17 특징

Java 17

  • 2021년 릴리즈
  • 애플 M1 및 이후 프로세서 탐재 제품군에 대한 정식 지원
  • 2029년 9월까지 지원합니다.
  • Spring Boot 3.2.x, Spring Framework 6.0.x, 6.1.x

Java 17 을 선택한 이유

  • Spring Boot 3.0 버전부터는 java 17 이상을 지원합니다. 
  • 가비지 컬렉션 알고리즘이 개선되어 메모리 관리 효율이 향상되었습니다. -> ZGC가 JDK15부터 정식으로 인정되어 반영되었습니다.
  • 패턴 매칭, 레코드, Sealed 클래스 등과 같은 새로운 언어 기능이 도입되어 개발자들의 생산성이 향상되었습니다.

추가된 기능

1. 향상된 의사 난수 생성기

- 이전 버전의 JDK: 여러 클래스의 의사 난수 생성기가 있지만, 공통 인터페이스가 없어 다른 생성기 구현 클래스로 교체하기 어려웠습니다.

Random random = new Random();
int number = random.nextInt(10);

- 새로운 인터페이스인 RandomGenerator가 모든 기존 및 새 생성기에 대해 균일한 API를 제공합니다.

- 새로운 난수 생성기를 구현한 클래스를 제공합니다. ex) SplittableRandom, Xoroshiro128Plus, L64X128MixRandom

- 더 예측하기 힘든 안전한 난수를 생성할 수 있게 되었습니다.

 

RandomGenerator generator = RandomGenerator.getDefault(); //default 생성기를 선택
generator = RandomGeneratorFactory.of("Xoroshiro128PlusPlus").create(); // 특정 알고리즘 선택
// 난수 생성
int randomInt = generator.nextInt();

 

2. 텍스트 블록 기능 추가

- Java 문자열을 보다 가독성 있게 작성되도록 도와줍니다.

String html2 = """
        <html>
            <body>
                <p>Hello, world</p>
            </body>
        </html>
        """;

 

3. Record Data class 추가

- 불필요한 코드를 제거하고 적은 코드로 명확한 의도를 표현할 수 있습니다.

  • 모든 필드는 불변
  • final 클래스
  • 주로 dto에 사용
  • 메서드 자동 생성 : equals(), hashCode(), toString()
  • 생성자 자동 생성
@Builder
public record FoodDto(
    String name,
    LocalDate expirationDate,
    long ftypeId,
    String qrId
) { }

 

4. 봉인 클래스(Sealed Class) 정식 추가

- 상속하거나, 구현할 클래스를 지정해 두고, 해당 클래스들만 상속 또는 구현을 허용하는 키워드로, 어떤 클래스가 해당 클래스를 상속 또는 구현했는지를 쉽게 알 수 있고 제한할 수 있습니다.

public sealed class Shape permits Circle, Square {
}

public final class Circle extends Shape {
}

public final class Square extends Shape {
}

 

5. Switch에서 패턴 매칭 (Preview)

- Object Type에 따라 분기가 가능합니다.

- Null 값에 대한 처리가 가능합니다.

- 다수의 매칭조건을 명시할 수 있습니다.

- 타입 매칭 후 추가적인 논리 조건 삽입이 가능합니다.

switch(o) {
	case null -> "null";
	case Integer i -> String.format("%d", i);
    case Long l -> String.format("%d", l);
    case Double d -> String.format("%f", d);
    case String s -> String.format("%s", s);
    default -> o.toString();
}

'BackEnd > Java' 카테고리의 다른 글

[Java] Java 21 특징  (3) 2024.07.15
[Java] Java 11 특징  (0) 2024.06.21
[Java] Java 8 특징  (0) 2024.06.21
[Java] Virtual Thread  (0) 2024.06.06