자바 13 기능

자바 13은 2019년 9월 17일에 프로덕션용으로 출시되었습니다. 6개월마다 릴리스되는 주기 때문에 자바 13에는 개발자를 위한 많은 특징이 없습니다.

자바 13 기능

중요한 자바 13 기능 중 일부는 다음과 같습니다:

  • 텍스트 블록 – JEP 355
  • 텍스트 블록을 위한 String 클래스의 새로운 메소드
  • 스위치 표현식 개선 – JEP 354
  • 레거시 소켓 API 재구현 – JEP 353
  • 동적 CDS 아카이브 – JEP 350
  • ZGC: 사용되지 않는 메모리 해제 – JEP 351
  • FileSystems.newFileSystem() 메소드
  • Unicode 12.1 지원
  • 네임스페이스 지원이 있는 DOM 및 SAX 팩토리

미리보기 기능 활성화 방법

스위치 표현식과 텍스트 블록은 미리보기 기능입니다. 따라서 프로젝트에서 미리보기 기능 설정을 활성화해야 합니다. 명령줄에서 자바 프로그램을 실행하는 경우 --enable-preview 스위치를 사용하여 활성화할 수 있습니다. 이 스위치를 사용하여 미리보기 기능이 활성화된 JShell을 시작할 수 있습니다.

$ jshell --enable-preview

$ java --enable-preview --source 13 Test.java

Eclipse IDE를 사용하는 경우 프로젝트 Java 컴파일러 설정에서 미리보기 기능을 활성화할 수 있습니다.

Eclipse Enable Preview Features

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. 텍스트 블록을 위한 문자열 클래스의 새로운 메서드

문자열 클래스에는 텍스트 블록 기능과 관련된 세 가지 새로운 메서드가 있습니다.

  1. formatted(Object… args): String format() 메서드와 유사합니다. 텍스트 블록과 함께 서식 지정을 지원하기 위해 추가되었습니다.
  2. stripIndent(): 텍스트 블록에서 각 줄의 시작과 끝에 있는 부수적인 공백 문자를 제거하는 데 사용됩니다. 이 메서드는 텍스트 블록에서 사용되며 내용의 상대적인 들여쓰기를 보존합니다.
  3. 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. Switch 표현식 개선 – JEP 354

스위치 표현식은 Java 12 릴리스에서 미리보기 기능으로 추가되었습니다. Java 13에서 “break” 대신에 “yield”로 케이스 문에서 값을 반환하는 것을 제외하고 거의 동일합니다.

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");
		}

		// Java 13부터 - 다중 레이블 케이스 문
		switch (choice) {
		case 1, 2, 3:
			System.out.println(choice);
			break;
		default:
			System.out.println("integer is greater than 3");
		}

		// 스위치 표현식, Java 12에서는 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. Legacy 소켓 API 재구현 – JEP 353

java.net.Socket 및 java.net.ServerSocket API의 내부 구현이 다시 작성되었습니다. 새로운 구현인 NioSocketImpl은 PlainSocketImpl의 완벽한 대체품입니다. synchronized 메서드 대신에 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 Garbage Collector는 Java 11에서 소개되었습니다. 힙 메모리 정리 전에 짧은 일시 정지 시간을 추가합니다. 그러나 사용되지 않는 메모리가 운영 체제에 반환되지 않았습니다. 이는 IoT 및 마이크로칩과 같은 작은 메모리 풋프린트를 가진 장치들에 대한 우려였습니다. 이제 사용되지 않는 메모리를 운영 체제에 반환하도록 향상되었습니다.

7. FileSystems.newFileSystem() 메서드

FileSystems 클래스에는 파일 시스템의 내용을 파일로 취급하는 파일 시스템 제공자를 더 쉽게 사용할 수 있도록 3개의 새로운 메서드가 추가되었습니다.

  1. newFileSystem(Path)
  2. newFileSystem(Path, Map<String, ?>)
  3. newFileSystem(Path, Map<String, ?>, ClassLoader)

8. DOM 및 SAX 팩토리에 대한 네임스페이스 지원

네임스페이스 지원을 갖춘 DOM 및 SAX 팩토리를 인스턴스화하기 위한 새로운 메서드가 있습니다.

  1. newDefaultNSInstance()
  2. newNSInstance()
  3. newNSInstance(String factoryClassName, ClassLoader classLoader)
// 자바 13 이상
DocumentBuilder db = DocumentBuilderFactory.newDefaultNSInstance().newDocumentBuilder(); 

// 자바 13 이전
DocumentBuilderFactory dbf = DocumentBuilderFactory.newDefaultInstance(); 
dbf.setNamespaceAware(true); 
DocumentBuilder db = dbf.newDocumentBuilder();

결론

자바의 6개월마다의 릴리스가 잘 작동하는 것으로 보입니다. 개발자를 위한 특정 기능은 많지 않지만, 전반적으로 훌륭한 릴리스입니다. 오래 기다렸던 텍스트 블록 문자열 지원을 볼 수 있어 좋습니다.

참고 자료

Source:
https://www.digitalocean.com/community/tutorials/java-13-features