JDK 17

dragonappear·2023년 1월 13일
0

Java

목록 보기
21/22


참고


Java 17 버전

  • 2021년 9월에 새로 공개한 LTS(Long Term Support) 버전으로 Oracle JDK 기준으로 2029년 9월까지 지원한다

JDK 버전별 점유율 참고
2020 , 2021


자바 8

  • 자바8은 나온지 오래된 자바 버전임에도, 많은 회사에서 현재까지 많이 사용중인 버전이다.
  • 왜 사용을 할까? 여러가지 이유가 있겠지만
    • 발표된 LTS 버전 중 가장 오래된 support 보장해준다.
    • 현재 국내에서 개발된 프로젝트 대다수가 java8로 개발되어 운영하고 있다.
    • 그렇기 때문에 다른 제품들과의 호환성 및 안정성을 위해 JDK를 업그레이드 하지 않고 있다.

벨로그에 국내 jdk 버전에 대해 재밌는 이야기를 한 것
한 번 읽어보시라 재밌는글 입니다


JDK 17을 사용하려고 하는 이유

  • 신규 버전을 위한 대비
    • Java 8 혹은 Java 11에서 바로 Java 21로 전환 시 마이그레이션으로 인한 영향이 최소화될 것이다
  • 다음 세대 플랫폼 호환 준비
    • 스프링부트 3.0부터는 JDK17 이상을 지원한다
    • SpringBoot 3.0

JDK 17까지의 주요 업데이트

JDK9 ~ JDK11까지 주요 업데이트

New Garbage Collector, ZGC 추가

참고: https://www.blog-dreamus.com/post/zgc%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

JDK 11부터 공개되었고, STW로 인한 성능저하를 개선하기 위한 목적을 가지고 오라클에서 개발하였다.

ZGC 동작원리

https://wiki.openjdk.org/display/zgc/Main
https://github.com/openjdk/zgc

  • Pause Mark Start
    • Colored Pointers 알고리즘을 기반해 ZGC Root에서 가리키는 객체의 상태값을 Mark(저장) 한다.
  • Pause Mark End
    • 새로 들어온 객체를 대상으로 Mark가 일어나고, ZPage(ZGC에서 다루는 영역)을 찾아 RelocationSet()에 배치한다
  • Pause Relocate Start
    • 참조 객체에 대한 재배치를 하며, 이후 Load Barriers 알고리즘을 통해 모든 객체를 안전하게 업데이트한다.

특징

  • 대기 시간이 짧은 Application에 적합한 GC이다.
  • Thread가 실행중일때 동시 작업을 수행하기에 모든 작업을 동시에 수행한다 (병렬처리)
  • 처리 시간이 10ms를 초과하지 않아 짧은 지연시간을 보장한다.
  • 8MB~16TB까지의 heap 크기를 지원한다.

적용방법

java -XX:+UseZGC -jar Application.java

Collection Factory Method 강화

 // 변경 전
 Set<String> set = new HashSet<>();
 set.add("a");
 set.add("b");
 
 // 변경 후
 Set<String> set = Set.of("a", "b", "c");
 
 // 변경 전
 List<String> list = new ArrayList<>();
 list.add("a");
 list.add("b");
 list.add("c");
 list.add("d");
 list.add("e");
 
  // 변경 후
   List<String> list = List.of("a", "b", "c", "d", "e");

 // 변경 전
 Map<String, String> map = new HashMap<>();
 map.put("J","a");
 map.put("B","b");
 map.put("Z","c");
 map.put("M","d");
 map.put("E","e");
 
 // 변경 후
 Map<String, String> map
    = Map.of(
    "J", "a",
    "B", "b",
    "Z", "c",
    "M", "d",
    "E", "e");

Reactive Stream

http://www.reactive-streams.org/
https://www.baeldung.com/spring-webflux

로컬 변수 타입 추론 var

  • 컴파일 시 변수 타입을 추론하기 때문에 성능에 영향을 주지는 않는다.
  • 그러나 가독성 높은 코드 작성을 위해 무분별한 “var” Keyword 이용은 지양하는게 좋을듯하다.
var strData = "a";
var doubleData = 1.5;
var intData = 100;

var datas = List.of(strData, doubleData, intData);

for (var data : datas) {
   ...
}

신규 문자열 Method 추가

  • isBlank: 문자열이 비어있거나 공백이면 True 반환
  • lines: 줄 단위로 나뉘어 있는 문자를 배열로 반환
  • strip: 문자열 공백 제거 (기존 “trim()”이 ‘\u0020’ 이하 공백만을 제거 하였다면, “strip()”은 유니코드의 공백들을 전부 제거)
  • stripLeading: 문자열 앞의 공백을 제거
  • stripTrailing: 문자열 뒤의 공백을 제거
  • repeat: 문자열을 파라미터로 주어진 수 만큼 반복

public static void isBlankMethod() {
   "".isBlank();        // Output :: true
   "abc".isBlank();  // Output :: false
}

public static void linesMethod() {
   "a\nb\nc\nd\ne".lines().toArray();
   // Output :: [a, b, c, d, e]
}

public static void stripMethod() {
   " abc ".strip();         // Output :: (abc)
   " abc ".stripLeading();  // Output :: (abc  )
   " abc ".stripTrailing(); // Output :: (  abc)
}

public static void repeatMethod() {
   "aaa ".repeat(3); // Output :: aaa aaa aaa 
}

JDK12 ~ JDK17까지 주요 업데이트

텍스트 블록

JDK 15부터 정식 지원하는 새로운 기능

“”” {String 문자열 } “”” 형식을 이용해 Java 문자열을 보다 가독성있게 작성하도록 도와준다

String message = """
      [
         {
            "type": "header",
            "text": {
                  "type": "plain_text",
                  "text": "%s :mag:",
                  "emoji": true
            }
         },
         {
            "type": "section",
            "text": {
                  "type": "mrkdwn",
                  "text": "*API*: %s\\n*remoteIP*: %s\\n*serverIP*: %s"
            }
         },
         {
            "type": "divider"
         }
      ]
         """.formatted(caller, apiName, remoteIP, serverIP);

Switch 표현식 기능 향상

  1. Switch문 값 직접 반환
  2. yield 예약어 이용한 값 리턴 방식 추가.
  3. Case문 람다식 지원.
var randomNames = new String [] {"a", "b", "c", "d", "e"}[(int) (Math.random() * 5)];

String name = switch(randomNames) {
   case "a", "b" -> {
      System.out.println("Me!");
      yield "a";
   }
   case "b", "b" -> "b";
   case "c" -> "c";
   case "d" -> "d";
   case "e" -> "e";
   default -> "What's your name";
};

Record Data Class 추가

Record Data Class란, JDK 14 버전부터 공개된 Immutable 객체를 생성하는 새로운 유형의 클래스이다.

  • Record 선언을 하게 되면 기존 toString, equals, hashCode 메소드를 자동으로 구현해주며, 모든 인스턴스 필드를 초기화해주는 생성자가 생성이 된다.

  • Immutable 객체이기 때문에 모든 값은 생성자를 통해 설정되어야 한다

  • DTO와 같은 Data Object 용도로 활용 시 보다 편리하고 간결하게 구분할 수 있다.

  • ModelMapper 라이브러리는 setter를 통해 값을 설정하기 때문에 Record Class를 ModelMapper에 사용할 수 없는 것으로 확인되었다.

  • Record Class는 상속이 불가능하다. (모든 필드는 private final로 선언되어있다.)

   public record RecordUserData(String name, int weight) {
      
   }

   ...

   RecordUserData userRecord = new RecordUserData("a", 110);

   // Output :: a
   System.out.println(userRecord.name());

   // Output :: 110
   System.out.println(userRecord.weight());

   // Output :: false
   System.out.println(userRecord.equals(new RecordUserData("b", 90)));

   // Output :: RecordUserData[name=a, weight=110]
   System.out.println(userRecord);

0개의 댓글