JavaRush /Java Blog /Random-KO /자바 13: 새로운 기능

자바 13: 새로운 기능

Random-KO 그룹에 게시되었습니다
우리는 6개월마다 새로운 JDK 릴리스가 출시된다는 사실에 이미 익숙해졌습니다. 지금까지 이 접근 방식은 그 자체로 정당화되었으며 업데이트를 따라잡지 못할 것이라는 일부 개발자의 걱정은 헛된 것이었습니다. 6개월 간의 변경 사항이 거의 없고 이전만큼 글로벌하지 않습니다. 글쎄, 초보 프로그래머는 혁신을 전혀 눈치 채지 못할 수도 있습니다. Java 13: 새로운 기능 - 1그러나 미래의 소프트웨어 개발자가 혁신을 따라가는 것이 더 좋습니다. 이 기사에서는 전통적으로 승인된 확장 제안(JEP)에 대해 설명합니다. Java 13에는 5개의 JEP와 76개의 새로운 핵심 라이브러리 요소만 포함되어 있습니다(이 중 거의 절반은 java.io 패키지에 대한 단순 추가 요소입니다).

JEP 355 : 텍스트 블록(미리보기)

언어의 구문을 변경하는 것부터 시작해 보겠습니다. 그 중 가장 중요한 것은 텍스트 블록입니다. 이를 통해 문자 이스케이프를 피하고 문자열 형식을 지정하는 방법을 알 수 있습니다. JDK 12에는 문자열 리터럴 작업에 필요한 원시 문자열 리터럴(JEP 326) 기능이 포함되지 않았다는 것을 기억 하실 것입니다 . Java 13에서는 텍스트 블록이 포함된 JEP 355로 대체되었습니다. 아마도 Java에서는 문자열이 큰따옴표로 묶여 있다는 것을 기억하실 것입니다. 이것은 좋지만 문제는 한 라인이 소스 파일의 한 라인 이상을 차지할 수 없다는 것입니다(Java 라인과의 혼동을 피하기 위해 여기서는 파일 라인을 "라인"이라고 부릅니다). 예를 들어, 구분 \n이 필요한 경우 기호를 사용하거나 여러 줄 표현식을 연결하여 사용해 보겠습니다. 별로 멋있게 나오진 않네요! HTML, XML, SQL 또는 JSON 조각이 포함된 텍스트 리터럴은 특히 다루기 어렵습니다. 이 모든 이스케이프 처리, 연결 및 수동 편집으로 인해 코드 작성이 불편해지고 읽기가 어려워집니다. 텍스트 블록은 이 문제를 해결하려고 합니다. 그들은 어... 큰 따옴표 세 개로 시작해서 그것으로 끝납니다(알아요, 별로 좋지 않은 것 같아요). 줄 바꿈을 포함하여 따옴표 사이의 모든 내용은 줄의 일부로 해석됩니다. 텍스트 블록은 표준 텍스트 리터럴과 정확히 동일하게 사용될 수 있으며 Java는 동일한 방식으로 코드를 컴파일합니다. 여는 따옴표 뒤에는 줄 구분 기호가 와야 합니다. 텍스트 블록은 한 줄에 사용할 수 없으므로 코드는
String smallBlock = """Only one line""";
다음과 같은 오류가 발생합니다.
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                          ^
TextBlock.java:3: error: illegal text block open delimiter sequence, missing line terminator
   String smallBlock = """Text Block""";
                                   	^
이제 간단한 HTML 조각을 다음과 같이 작성할 수 있습니다.
String htmlBlock = """
               	<html>
                 	<body>
                   	<p>CodeGym Web page</p>
                 	</body>
               	<html>
         	     """;
텍스트 블록을 사용할 때 주의해야 할 몇 가지 미묘한 사항을 언급하겠습니다. 닫는 따옴표의 위치는 중요합니다. 이는 가끔 공백을 처리하는 방법을 결정합니다. 위의 예에서 닫는 따옴표는 HTML 텍스트의 들여쓰기에 맞춰 정렬됩니다. 이 경우 컴파일러는 들여쓰기 공백을 제거하고 결과적으로 다음과 같은 줄을 얻게 됩니다.
<html>
  <body>
    <p>My web page</p>
  </body>
</html>
메모:그러한 줄은 줄 끝에 개행 문자를 포함합니다. 필요하지 않은 경우 닫는 따옴표 """를 </html> 태그 바로 뒤에 배치할 수 있습니다. 닫는 따옴표를 왼쪽 여백에 더 가깝게 이동하면 제거되는 들여쓰기 양이 변경됩니다. 왼쪽으로 두 칸 이동하면 각 줄에 들여쓰기를 위해 두 칸을 추가하게 됩니다. 왼쪽 가장자리로 이동하면 모든 패딩이 유지됩니다. 따옴표를 오른쪽으로 더 이동해도 효과가 없으며 더 이상 들여쓰기가 추가되지 않습니다. 텍스트 블록은 JDK 13에 미리보기 기능으로 포함되었습니다. 이는 해당 Java 언어 사양에 아직 포함되지 않았음을 의미합니다. 즉, 이 기능이 언어의 영구적인 일부가 될 것인지, 아니면 단지 손님일 뿐인지는 확실하지 않습니다. 현재 개발자는 기능을 테스트하고 이에 대한 의견을 제시할 수 있습니다. 텍스트 블록의 운명은 이에 따라 달라집니다. 기능을 개선할 수 있으며 마음에 들지 않으면 완전히 제거할 수 있습니다. 실제로 텍스트 블록을 시험해 보려면 컴파일하고 실행하려면 미리 보기 기능을 명시적으로 포함해야 한다는 점을 기억하세요. 편집:

javac --enable-preview --release 13 TextBlock.java
애플리케이션을 실행하려면 미리보기 기능을 활성화해야 합니다.

java --enable-preview TextBlock
클래스에는 String이러한 언어 변경을 보완하는 세 가지 새로운 메서드가 있습니다.
  • formatted(): 문자열 자체를 형식 문자열로 사용하여 문자열 형식을 지정합니다. 도전과 동일format(this, args)
  • stripIndent(): 문자열에서 임의의 공백을 제거합니다. 이는 여러 줄 문자열을 읽고 명시적 선언과 동일한 공백 제외를 적용하려는 경우에 유용합니다.
  • translateEscapes()\ r: 적절한 유니코드 값으로 변환된 이스케이프 시퀀스(예: )가 포함된 문자열을 반환합니다 .
이러한 메소드가 방금 등장했지만 이미 더 이상 사용되지 않는 것으로 표시되어 있다는 점이 흥미롭습니다 . 이러한 상황은 JDK의 향후 버전에서 해당 메소드가 제거될 수 있음을 시사합니다. 새로운 메소드를 추가하고 바로 버리는 것은 좀 이상한 것 같습니다. 그러나 이러한 방법은 변경되거나 제거될 수 있는 미리보기 기능과 연관되어 있습니다. 아마도 주석을 도입하면 @PreviewFeature이러한 상황에 도움이 될 수 있지만 아직 JDK에는 포함되어 있지 않습니다(JDK 14에 나타날 확률이 높음에도 불구하고).

JEP 354 : 스위치 식(미리보기)

Java 12에서는 스위치 문( JEP 325) 을 사용하여 표현식을 작성하는 새로운 형식에 대한 제안을 도입했습니다 . 이는 최초의 미리보기 기능으로 밝혀졌으며 그 운명은 사용자에게 제안서를 제출하는 것이 좋은 아이디어라는 것을 증명합니다. JDK 12 이전에는 switch작업을 수행하지만 결과를 반환하지 않는 문으로만 사용할 수 있었습니다. switch그러나 Java 12에서는 변수에 할당할 수 있는 결과를 반환하는 표현식으로 사용할 수 있었습니다 . 의 Case 문의 구문에 다른 변경 사항이 있었습니다 switch. 이것이 어떻게 작동하는지 이해하기 위해 JEP의 예를 살펴보겠습니다.
int numberOfLetters;
switch(dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
    numberOfLetter = 6;
    break;
  case TUESDAY
    numberOfLetter = 7;
    break;
  case THURSDAY
  case SATURDAY
    numberOfLetter = 8;
    break;
  case WEDNESDAY
    numberOfLetter = 9;
    break;
  default:
   throw new IllegalStateException("Huh?: " + day);
}
이 예에서는 value를 사용하여 dayOfWeek에 값을 할당합니다 numberOfLetters. 운영자의 작업 특성상 이 switch코드는 가장 아름답지도 않고 실수하기도 쉽습니다. 첫째, 각 사례 레이블 그룹에 문을 적용하는 것을 잊은 경우 break다음 사례 레이블 그룹이 기본값으로 사용됩니다. 이로 인해 찾기 어려운 오류가 발생할 수 있습니다. 둘째, 각 사례 레이블 그룹을 정의해야 합니다. 물론 잊어버리면 컴파일러 오류가 발생하지만 이 옵션은 이상적이지 않습니다. dayOfWeek우리 코드는 각 값에 고유한 대소문자 레이블이 있어야 하기 때문에 매우 장황합니다 . 새로운 구문을 사용하면 훨씬 더 깔끔하고 오류가 발생하기 쉬운 코드를 얻을 수 있습니다.
int numberOfLetters = switch (dayOfWeek) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh?: " + day);
};
이제 (표현식의 반환 값에서) 한 번만 할당하면 되며 switch케이스 레이블에 쉼표로 구분된 목록을 사용할 수 있습니다. 그리고 연산자를 사용하지 않기 때문에 break이와 관련된 문제를 제거합니다. 표현식 구문을 switch사용하면 이전 스타일 구문을 사용할 수 있으므로 JDK 12에서는 다음과 같이 작성할 수 있습니다.
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   break 6;
  case TUESDAY
   break 7;
  case THURSDAY
  case SATURDAY
   break 8;
  case WEDNESDAY
   break 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
Java 커뮤니티에 따르면 오버로딩을 사용하여 break반환 값을 지정하는 것은 혼란스러울 수 있습니다. Java 언어에서는 무조건 점프 연산자와 같은 레이블과 함께 break(and ) 를 사용할 수도 있습니다 . JEP 354에서는 이 사용법이 변경되었으므로 Java 13에서는 코드가 약간 변경됩니다. continuegotobreak
int numberOfLetters = switch (dayOfWeek) {
  case MONDAY:
  case FRIDAY:
  case SUNDAY:
   yield 6;
  case TUESDAY
   yield 7;
  case THURSDAY
  case SATURDAY
   yield 8;
  case WEDNESDAY
   yield 9;
  default:
   throw new IllegalStateException("Huh?: " + day);
};
다음 세 개의 JEP는 Java Virtual Machine과 연결되어 있습니다.

JEP 350 동적 CDS 아카이브

이 확장을 사용하면 Java 애플리케이션 실행이 끝날 때 클래스를 동적으로 보관할 수 있습니다. class data sharingCDS 또는 클래스 데이터 공유를 사용하면 기본적으로 동일한 클래스 목록을 사용하여 시작 시 시작된 모든 클래스를 특수 아카이브로 압축할 수 있습니다 . 이로 인해 응용 프로그램 실행 및 RAM 절약이 크게 가속화됩니다. 이전에는 AppCDS를 사용하는 것은 관련 클래스 목록을 생성하고 해당 목록을 사용하여 후속 실행에 사용할 아카이브를 생성하는 다단계 프로세스였습니다. 이제 필요한 것은 ArchiveClassesAtExit아카이브가 기록될 위치를 나타내는 -XX: 플래그를 사용하여 애플리케이션을 한 번 실행하는 것뿐입니다. 이 접근 방식을 사용하면 애플리케이션이 정상적으로 중지된 후 클래스가 자동으로 아카이브에 패키지됩니다.

JEP 351 ZGC : 사용되지 않은 메모리 커밋 해제

1년 전 JDK 11 에서는 실험적이고 확장 가능하며 대기 시간이 짧은 가비지 수집기인 ZGC를 출시했습니다. 처음에 ZGC는 다소 이상하게 동작했습니다. 메모리가 더 이상 필요하지 않더라도 운영 체제에 메모리가 반환되는 것을 허용하지 않았습니다. 여러 서비스에서 동시에 리소스를 사용하는 컨테이너와 같은 일부 환경에서는 이로 인해 시스템의 확장성과 효율성이 제한될 수 있습니다. ZGC 힙은 소위 ZPage로 구성됩니다. 가비지 수집 주기 중에 ZPage가 지워지면 ZPageCache로 반환됩니다. 이 캐시의 ZPage는 최근 사용된 순서에 따라 정렬됩니다. Java 13에서 ZGC는 오랫동안 사용되지 않는 것으로 식별된 페이지를 운영 체제에 반환합니다. 이렇게 하면 다른 프로세스에 재사용할 수 있습니다.

JEP 353 레거시 소켓 API 재구현

두 API 구현 모두 여전히 JDK 1.0 java.net.Socket입니다 . java.net.ServerSocket이 JDK와 모든 후속 JDK에서 이러한 API의 구현은 유연하지 않고 유지 관리를 어렵게 만드는 여러 기술(예: 스레드 스택을 I/O 버퍼로 사용)을 사용합니다. 이 문제를 해결하기 위해 JDK 13에서는 새로운 구현이 제공되었습니다 NioSocketImpl. 더 이상 네이티브 코드가 필요하지 않으므로 다른 플랫폼으로 쉽게 이식할 수 있습니다. java.util.concurrent또한 이 클래스는 동기화된 메서드 대신 기존 버퍼 캐시 메커니즘(이 목적으로 스레드 스택을 사용하지 않음)과 잠금을 사용합니다 . 이는 Project Loom 의 파이버와의 통합을 단순화합니다 .

새로운 API

앞서 Java 13에는 기본 클래스 라이브러리에 76개의 새로운 API가 포함되어 있다고 언급했습니다. 여기에는 다음 영역이 포함됩니다.
  • 유니코드 지원 업데이트.
  • String텍스트 블록을 지원하는 세 가지 새로운 방법 (위의 JEP 255 설명 참조)
  • 이제 클래스 java.nio에는 절대(상대와 반대) get 방법을 설정합니다. 기본 추상 클래스와 마찬가지로 버퍼의 일부를 검색하는 Buffer메서드를 포함합니다 . slice()
  • force()클래스 메서드는 MappedByteBuffer버퍼 섹션을 지원 저장소에 강제로 기록합니다.
  • nio.FileSystemnewFileSystem()파일 시스템으로 파일 내용에 액세스하기 위한 세 가지 새로운 오버로드된 형식을 추가합니다 .
  • 새로운 흥미로운 방법이 나타 났습니다 javax.annotation.processing.ProcessingEnvironment. isPreviewEnabled(). 미리보기 기능이 활성화되어 있는지 알려줍니다. 위에서 언급한 주석은 @PreviewFeatureJDK 14가 출시될 때까지 사용할 수 없기 때문에 흥미롭습니다.
  • DocumentBuilderFactory네임스페이스 인식 인스턴스를 생성하기 위한 세 가지 새로운 방법을 SAXParserFactory얻으세요 .javax.xml.parsers
이 자료는 Simon Ritter 의 기사 와 공식 문서를 기반으로 합니다 .
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION