1. Oracle vs. Open JDK
Java 10은 라이센스 없이 상업적으로 사용할 수 있는 오라클의 마지막 무료 배포 버전이었다. Java 11부터 무료 LTS(long-term support) 버전은 더 이상 제공되지 않는다.
대신에 오라클은 무료로 사용할 수 있는 Open JDK 를 계속해서 제공한다. 오라클 뿐만 아니라, 다른 Open JDK providers 들도 고려해볼 수 있다.
2. 개발자들에게 유용한 기능
2.1 새로운 String 메서드
Java 11은 String class에 몇몇 새로운 메서드들을 추가하였다. : isBlank, lines, strip, stripLeading, stripTrailing, repeat
아래는 사용 예시이다.
String multilineString = "Baeldung helps \n \n developers \n explore Java.";
List<String> lines = multilineString.lines()
.filter(line -> !line.isBlank())
.map(String::strip)
.collect(Collectors.toList());
assertThat(lines).containsExactly("Baeldung helps", "developers", "explore Java.");
2.2 새로운 File 메서드
파일의 문자열들을 읽고 쓰는 것이 더 쉬워졌다. Files class의 readString, writeString static 메서드를 사용할 수 있다.
Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");
2.3 Collection 에서 배열로
java.util.Collection 인터페이스는 IntFunction 인자를 받는 toArray default 메서드를 포함하게 되었다.
List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");
2.4 Not Predicate 메서드
Predicate 인터페이스에 not 메서드가 추가되었다. 이것을 활용하여 존재하는 Predicate을 무효화할 수 있다.
List<String> sampleList = Arrays.asList("Java", "\n \n", "Kotlin", " ");
List withoutBlanks = sampleList.stream()
.filter(Predicate.not(String::isBlank))
.collect(Collectors.toList());
assertThat(withoutBlanks).containsExactly("Java", "Kotlin");
2.5 람다식에 대한 지역변수 구문
Java 11부터 지역변수 구문을 람다식에 사용할 수 있다.
이 기능을 사용하여 타입 어노테이션을 정의하는 것과 같이 로컬 변수에 수정자를 적용할 수 있다
List<String> sampleList = Arrays.asList("Java", "Kotlin");
String resultString = sampleList.stream()
.map((@Nonnull var x) -> x.toUpperCase())
.collect(Collectors.joining(", "));
assertThat(resultString).isEqualTo("JAVA, KOTLIN");
2.6 HTTP Client
Java 9에서 소개되었던 java.net.http 패키지의 HttpClient가 Java 11에서 표준 기능이 되었다.
새로운 HTTP API는 전반적인 성능 향상과 HTTP/1.1, HTTP/2에 대한 지원을 제공한다.
HttpClient httpClient = HttpClient.newBuilder()
.version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(20))
.build();
HttpRequest httpRequest = HttpRequest.newBuilder()
.GET()
.uri(URI.create("http://localhost:" + port))
.build();
HttpResponse httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandlers.ofString());
assertThat(httpResponse.body()).isEqualTo("Hello from the server!");
2.7 Nested class 에 대한 제어
다음과 같이 Nested class에 대한 제어를 제공한다.
assertThat(MainClass.class.isNestmateOf(MainClass.NestedClass.class)).isTrue();
assertThat(MainClass.NestedClass.class.getNestHost()).isEqualTo(MainClass.class);
Set<String> nestedMembers = Arrays.stream(MainClass.NestedClass.class.getNestMembers())
.map(Class::getName)
.collect(Collectors.toSet());
assertThat(nestedMembers).contains(MainClass.class.getName(), MainClass.NestedClass.class.getName());
2.8 Java 파일 실행하기
더이상 명시적으로 javac 명령어를 통해 Java 파일을 컴파일할 필요가 없다.
$ java HelloWorld.java
Hello Java 11!
※ 참조
'Java의 새로운 기능' 카테고리의 다른 글
Java 13의 새로운 기능 (1) | 2024.06.06 |
---|---|
Java 12의 새로운 기능 (0) | 2024.06.05 |
Java 10의 새로운 기능 - 기타 (0) | 2021.10.07 |
Java 10의 새로운 기능 - 성능 향상 (0) | 2021.09.24 |
Java 10의 새로운 기능 - 지역변수 타입 추론 (0) | 2021.09.23 |