Java 17에 대해

주운·2024년 1월 24일

이번 프로젝트를 진행하며 Java 17을 사용하게 되었다.
"Java 17을 왜 사용해요?"
"Java 17의 특징을 말해보세요."
에 답하기 위해 정리해보았다.


2023 jetbrains 보고서

Java17 VS Java8

2023년 기준 가장 많이 사용되는 Java 버전은 Java8, 2위는 Java17이다.

불과 2022년에는 Java11이 48%의 점유율로 2위를 차지했지만 1년만에 순위가 바뀌었다.

2021년 9월에 공개된 Java17이 빠른 시간 안에 널리 사용된 이유는 무엇일까?

Java 17

2029년 9월까지 지원하는 LTS

Java 17은 Java 8, Java 11과 함께 오랜 기간 지원하는 LTS 버전이다.

Spring Boot 3부터 Java 17 이상의 사용이 강제된다.

가장 큰 이유가 아닐까 생각된다.

2023년 기준 Java 웹 프레임워크에 대한 조사 결과다.
SpringBoot의 점유율이 압도적으로 큰 만큼 직접적인 이유라고 생각된다.

Java 버전별 특징

Java 8

2023년까지도 가장 많이 사용하는 java 버전이다.
2030년 12월까지 지원해 가장 긴 지원기간을 가진다.

  • Lambda
  • Stream
  • Interface default Method
  • Optional
  • LocalDateTime

Java 11

Java 11까지의 추가사항

  • Jigsaw 모듈 시스템
  • New Garbage Collector, ZGC 추가
  • Thread-Local Handshakes
  • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리 할당
  • Multi-Release JAR File
  • jlink
  • JShell
  • Collection Factory Method 기능 강화
  • Interface, Private Method 도입
  • Optional ifPresentOrElse Method 추가
  • HTML5 Javadoc
  • HTTP 2 Client
  • Reactive Stream
  • 로컬 변수 타입 추론 "var"
  • 신규 문자열 Method 추가

Java 17

Java 17까지의 추가사항

  • 향상된 의사 난수 생성기
  • 신규 Mac OS 렌더링 파이프라인
  • 텍스트 블록 기능 추가
  • Switch 표현식 기능 향상
  • Record Data class 추가
  • Instanceof 매칭
  • NumberFormat 클래스 기능 향상
  • DateTimeFormatter 클래스 기능 향상
  • 봉인(Sealed) 클래스
  • Stream.toList() 기능 추가
  • 신규 문자열 Method 추가

텍스트 블록

  • JDK 15부터 정식 지원한다.
  • 가독성 있는 문자열을 작성할 수 있다.
  • format method, 문자열 형식 지정자를 쓸 수 있다.
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

  • Switch문 값을 직접 반환할 수 있다.
    • case, break, default로 국한되었던 기존 방식과 달라졌다.
    • break는 사라졌다.
  • yield 예약어 이용한 값 리턴 방식이 추가되었다.
  • Case문에서 람다식을 지원한다.
var randomNames = new String [] {"Jayden", "Bernard", "Zino", "Mason", "Elvin"}[(int) (Math.random() * 5)];

String name = switch(randomNames) {
   case "Jayden", "jayden" -> {
      System.out.println("Me!");
      yield "제이든";
   }
   case "Bernard", "bernard" -> "버나드";
   case "Zino" -> "자이노";
   case "Mason" -> "메이슨";
   case "Elvin" -> "엘빈";
   default -> "What's your name";
};

Record Data Class

  • JDK 14 버전부터 지원한다.
  • Immutable 객체를 생성한다.
  • Record 선언을 하게 되면 기존 toString, equals, hashCode 메소드를 자동으로 구현한다.
    모든 인스턴스 필드를 초기화해주는 생성자를 생성한다.
...
   public record RecordUserData(String name, int weight) {
      
   }

   ...

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

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

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

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

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

...

문자열 함수

  • Java 13 버전부터 지원한다.
  • String::stripIndent()
    • 문자열의 여백을 자동으로 제거한다.
  • String::translateEscapes()
    • 문자열의 이스케이프 시퀀스를 다른 문자로 변환한다.

참고

jdk17 도입 이유
Java17을 왜 고려해야 할까?
switch
record DTO

0개의 댓글