간단이론정리/JAVA

about Java 17

눕고싶은사람 2024. 6. 13. 14:23

Java 17은 21년 9월에 공개된 세번째 LTS 버전으로 29년 9월까지 지원된다.

 

23년 기준 Java 17 채택률은 약 45% (출처 : jetbrains)

 

※ Spring Boot 3.0 버전 부터는 JDK 17 이상만을 지원한다.

※ Spring Boot 3.0 이상 사용을 위해 JDK 17이 필요하고, 또한 JDK 17은 지원 기간이 길기 때문에 채택률은 더 올라갈 것으로 생각된다.

※ 그러나 서비스에서 사용하는 서드파티 호환성을 따져봐야한다.


Java 17에 추가된 내용

  • 봉인 클래스(Sealed Classes)
  • 의사 난수 생성 API 확장

1. 봉인 클래스(Sealed Calsses)

상속을 통해 코드를 재사용할 수 있지만 무분별한 상속은 오히려 설계와 가독성에 있어서 안좋은 영향을 끼친다.

봉인 클래스를 통해 허용되는 하위 유형을 정의하여 세분화된 상속 제어를 할 수 있다. 즉, 확장(extends)하거나 구현(implements)할 수 있는 클래스 또는 인터페이스를 지정하여 허용된 것들만 상속/구현이 가능하도록 제한할 수 있다.

 

public sealed class Shape permits Circle, Rectangle {
    ...
}

final class Circle extends Shape {
    ...
}

non-sealed class Rectangle extends Shape {
    ...
}

특정 클래스가 어떤 서브 클래스를 가질 수 있는지 개발자가 명시적으로 제어할 수 있다.

 

※ 나중에 제대로 살펴보기

 

 

2. 의사 난수 생성 API 확장

기본 legacy 랜덤(java.util.Random) 클래스를 확장, 리팩토링한 RandomGenerator 난수 생성 API가 추가되었다.

RandomGeneratorFactory.all()
    .map(factory -> String.format("%s: %s", factory.group(), factory.name()))
    .sorted()
    .forEach(System.out::println);

 

이 외에도 Java 11 ~ Java 17까지 오면서 추가된 기능들 중 많이 사용하며 유용한 기능들도 정리해보고자 한다.

  • Record Class (java 14 preview / java 16 release)
  • instanceof 패턴 매칭 (java 14 preview / java 16 release)
  • 다중 텍스트 블록 (java 13 preview / java 15 release)

 

1. Record Class

데이터 클래스를 의미하며 DTO와 같은 클래스를 쉽게 정의 할 수 있다.

자동으로 필드를 캡슐화 시키며 모든 클래스 멤버에 대한 생성자와 public을 갖는 getter, equals, hashCode, toString 메서드가 자동으로 생성된다.

[As-Is]
public class Member {
	private final String name;
    private final int age;
    
    public Member(final String name, final int age) {
    	this.name = name;
        this.age = age;
    }
    
    public String getName() {
    	return name;
    }
    
    public int getAge() {
    	return age;
    }
}

[To-Be]
public record Member (String name, int age){}

 

물론 Record가 아닌 Lombok을 사용 할 수 있고 사용하고 있지만 외부 라이브러리 없이도 사용 가능한 클래스라는 것이 의미가 있다.

 

2. instanceof 패턴 매칭

// 자바 17 이전
if (obj instanceof String) {
    String s = (String) obj;
    // s를 사용하는 로직
}

// 자바 17 이후
if (obj instanceof String s) {
    // s를 사용하는 로직
}

 

3. 다중 텍스트 블록

문자열 가공 혹은 디스플레이에 있어 개행 값을 표현하기 위해 \n 을 무수히 사용 할 필요가 없어짐

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

 

 


참고 및 출처

https://seoarc.tistory.com/100

 

[Java] Java 버전 별 특징

JDK 1.0 1996년 1월에 공개되었으며 발표 이전에 불린 이름은 Oak였다. 안정화 작업을 거친 1.0.2 버전에서 Java로 이름이 바뀌었다. JDK 1.1 1997년 2월에 공개했으며 JDBC, Inner Class, Java Beans, RMI, Reflection, Un

seoarc.tistory.com

https://kookiencream.tistory.com/127#1.2%20Java17-1

 

바톤 팀이 Java17를 사용하는 이유

바톤 팀이 Java17를 사용하는 이유 0. 들어가기 전에 우테코 팀 프로젝트에서 저희 팀이 자바 버전을 선택한 이유에 대해서 정리해보았습니다. 1. Java11 vs Java 17 자바 버전을 고르기 위해 후보가 몇

kookiencream.tistory.com

https://youngwonhan-family.tistory.com/entry/Java-17-%EC%A3%BC%EC%9A%94-%ED%8A%B9%EC%A7%95-with-%EC%98%88%EC%A0%9C-%EC%83%98%ED%94%8C-%EC%BD%94%EB%93%9C

 

Java 17 주요 특징 with 예제 샘플 코드

1. record ( From java 14 ) record는 간결하면서, 변경 불가한 객체를 위한 새로운 타입입니다. record를 사용하면 기존에 장황했던 코드를 몇 줄의 간결한 코드로 축약할 수 있습니다. 👍 다음 샘플 코드

youngwonhan-family.tistory.com