자바 13 기능
Java 13은 2019년 9월 17일 프로덕션용으로 릴리스되었습니다. 릴리스 주기가 6개월이기 때문에 Java 13에는 개발자별 기능이 많지 않습니다.
자바 13 기능
중요한 Java 13 기능 중 일부는 다음과 같습니다.
- 텍스트 블록 - JEP 355
- 텍스트 블록에 대한 문자열 클래스의 새로운 메소드
- Switch 표현식 향상 - JEP 354
- 레거시 소켓 API 재구현 - JEP 353
- 동적 CDS 아카이브 - JEP 350
- ZGC: 미사용 메모리 커밋 해제 - JEP 351
- FileSystems.newFileSystem() 메서드
- 유니코드 12.1 지원
- 네임스페이스를 지원하는 DOM 및 SAX 팩터리
미리보기 기능을 활성화하는 방법
스위치 표현식과 텍스트 블록은 미리보기 기능입니다. 따라서 프로젝트에서 미리보기 기능 설정을 활성화해야 합니다. 명령줄에서 Java 프로그램을 실행하는 경우 --enable-preview
스위치를 사용하여 활성화할 수 있습니다. 이 스위치를 사용하여 미리 보기 기능이 활성화된 JShell을 시작할 수 있습니다.
$ jshell --enable-preview
$ java --enable-preview --source 13 Test.java
Eclipse IDE를 사용하는 경우 프로젝트 Java 컴파일러 설정에서 미리 보기 기능을 활성화할 수 있습니다.
1. 텍스트 블록 - JEP 355
이것은 미리보기 기능입니다. 여러 줄 문자열을 쉽게 만들 수 있습니다. 여러 줄 문자열은 한 쌍의 삼중 이중 따옴표 안에 작성해야 합니다. 텍스트 블록을 사용하여 만든 문자열 개체에는 추가 속성이 없습니다. 여러 줄 문자열을 만드는 더 쉬운 방법입니다. 텍스트 블록을 사용하여 한 줄 문자열을 만들 수 없습니다. 여는 삼중 이중 따옴표 뒤에는 줄 종결자가 와야 합니다.
package com.journaldev.java13.examples;
public class TextBlockString {
/**
* JEP 355: Preview Feature
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String textBlock = """
Hi
Hello
Yes""";
String str = "Hi\nHello\nYes";
System.out.println("Text Block String:\n" + textBlock);
System.out.println("Normal String Literal:\n" + str);
System.out.println("Text Block and String Literal equals() Comparison: " + (textBlock.equals(str)));
System.out.println("Text Block and String Literal == Comparison: " + (textBlock == str));
}
}
산출:
Text Block String:
Hi
Hello
Yes
Normal String Literal:
Hi
Hello
Yes
Text Block and String Literal equals() Comparison: true
Text Block and String Literal == Comparison: true
Java 프로그램에서 HTML 및 JSON 문자열을 쉽게 생성하는 데 유용합니다.
String textBlockHTML = """
<html>
<head>
<link href='/css/style.css' rel='stylesheet' />
</head>
<body>
<h1>Hello World</h1>
</body>
</html>""";
String textBlockJSON = """
{
"name":"Pankaj",
"website":"JournalDev"
}""";
2. 텍스트 블록에 대한 문자열 클래스의 새로운 메서드
문자열 클래스에는 텍스트 블록 기능과 관련된 세 가지 새로운 메서드가 있습니다.
- formatted(Object… args): String format() 메서드와 유사합니다. 텍스트 블록으로 서식을 지원하기 위해 추가되었습니다.
- stripIndent(): 텍스트 블록의 모든 줄의 시작과 끝에서 부수적인 공백 문자를 제거하는 데 사용됩니다. 이 방법은 텍스트 블록에서 사용되며 콘텐츠의 상대적 들여쓰기를 유지합니다.
- translateEscapes(): 값이 이 문자열인 문자열을 문자열 리터럴에서처럼 변환된 이스케이프 시퀀스와 함께 반환합니다.
package com.journaldev.java13.examples;
public class StringNewMethods {
/***
* New methods are to be used with Text Block Strings
* @param args
*/
@SuppressWarnings("preview")
public static void main(String[] args) {
String output = """
Name: %s
Phone: %d
Salary: $%.2f
""".formatted("Pankaj", 123456789, 2000.5555);
System.out.println(output);
String htmlTextBlock = "<html> \n"+
"\t<body>\t\t \n"+
"\t\t<p>Hello</p> \t \n"+
"\t</body> \n"+
"</html>";
System.out.println(htmlTextBlock.replace(" ", "*"));
System.out.println(htmlTextBlock.stripIndent().replace(" ", "*"));
String str1 = "Hi\t\nHello' \" /u0022 Pankaj\r";
System.out.println(str1);
System.out.println(str1.translateEscapes());
}
}
산출:
Name: Pankaj
Phone: 123456789
Salary: $2000.56
<html>***
<body> *
<p>Hello</p>** *
</body>*
</html>
<html>
<body>
<p>Hello</p>
</body>
</html>
Hi
Hello' " /u0022 Pankaj
Hi
Hello' " /u0022 Pankaj
3. 스위치 표현식 향상 - JEP 354
스위치 표현식이 Java 12 릴리스의 미리 보기 기능으로 추가되었습니다. case 문에서 값을 반환하기 위해 "break\가 "yield\로 대체되었다는 점을 제외하면 Java 13에서 거의 동일합니다.
package com.journaldev.java13.examples;
/**
* JEP 354: Switch Expressions
* https://openjdk.java.net/jeps/354
* @author pankaj
*
*/
public class SwitchEnhancements {
@SuppressWarnings("preview")
public static void main(String[] args) {
int choice = 2;
switch (choice) {
case 1:
System.out.println(choice);
break;
case 2:
System.out.println(choice);
break;
case 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// from java 13 onwards - multi-label case statements
switch (choice) {
case 1, 2, 3:
System.out.println(choice);
break;
default:
System.out.println("integer is greater than 3");
}
// switch expressions, use yield to return, in Java 12 it was break
int x = switch (choice) {
case 1, 2, 3:
yield choice;
default:
yield -1;
};
System.out.println("x = " + x);
}
enum Day {
SUN, MON, TUE
};
@SuppressWarnings("preview")
public String getDay(Day d) {
String day = switch (d) {
case SUN -> "Sunday";
case MON -> "Monday";
case TUE -> "Tuesday";
};
return day;
}
}
4. 레거시 소켓 API 재구현 - JEP 353
java.net.Socket 및 java.net.ServerSocket API의 기본 구현이 재작성되었습니다. 새로운 구현인 NioSocketImpl은 PlainSocketImpl을 대체합니다. 동기화된 메소드가 아닌 java.util.concurrent 잠금을 사용합니다. 레거시 구현을 사용하려면 java 옵션 -Djdk.net.usePlainSocketImpl을 사용하십시오.
5. 동적 CDS 아카이브 - JEP 350
이 JEP는 Java 10에서 도입된 클래스 데이터 공유 기능을 확장합니다. 이제 CDS 아카이브 생성 및 사용이 훨씬 쉬워졌습니다.
$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar
6. ZGC: 미사용 메모리 커밋 해제 - JEP 351
이 JEP는 사용하지 않는 힙 메모리를 운영 체제로 반환하도록 ZGC를 향상시켰습니다. Z 가비지 수집기는 Java 11에서 도입되었습니다. 힙 메모리 정리 전에 짧은 일시 중지 시간을 추가합니다. 그러나 사용되지 않은 메모리는 운영 체제로 반환되지 않았습니다. 이는 IoT 및 마이크로칩과 같이 메모리 공간이 작은 장치의 문제였습니다. 이제 사용하지 않는 메모리를 운영 체제로 반환하도록 개선되었습니다.
7. FileSystems.newFileSystem() 메서드
FileSystems 클래스에 세 가지 새로운 메서드가 추가되어 파일 내용을 파일 시스템으로 취급하는 파일 시스템 공급자를 더 쉽게 사용할 수 있습니다.
- newFileSystem(경로)
- newFileSystem(Path, Map
) - newFileSystem(Path, Map
, ClassLoader)
8. 네임스페이스를 지원하는 DOM 및 SAX 팩토리
네임스페이스 지원으로 DOM 및 SAX 팩토리를 인스턴스화하는 새로운 방법이 있습니다.
- newDefaultNSInstance()
- newNSInstance()
- newNSInstance(String factoryClassName, ClassLoader classLoader)
//java 13 onwards
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder();
// before java 13
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance();
dbf.setNamespaceAware(true);
DocumentBuilder db = dbf.newDocumentBuilder();
결론
Java 릴리스 6개월이 잘 작동하고 있는 것 같습니다. 개발자별 기능은 많지 않지만 전반적으로 훌륭한 릴리스입니다. 대망의 텍스트 블록 문자열 지원을 보는 것이 좋습니다.
참조
- JDK 13 릴리스 정보
- OpenJDK 13 다운로드 페이지
- 텍스트 블록 예
- Eclipse.org 자바 13 예제