Java11에 대하여 학습한 내용을 정리하게 되었습니다.
Java11은 Java8이후로 LTS 릴리즈 입니다. Oracle도 2019 년 1 월 Java 8 지원을 중단하였습니다.
Java11부터는 Oracle JDK가 유료화 되면서 무료로 사용하기 위해서는 OpenJDK를 사용해야 합니다.
String Class와 관련하여 여러 메서드가 추가되었습니다.
String multilineString = "My name \n \n is \n Jass.";
List<String> lines = multilineString.lines().filter(line -> !line.isBlank())
.map(String::strip)
.collect(Collectors.toList());
assertThat(lines).containsExactly("My name", "is", "Jass");
Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");
파일에 문자열을 작성하고 Path로 반환한다. 파일 오픈 옵션에 따라 작동 방식을 달리하며, charset을 지정하지 않으면 utf-8 이 사용됩니다.
오버로딩 메서드로 writeString(Path, String, OpenOption) 존재
파일 전체 내용을 읽어서 String으로 반환하고, 파일 내용을 모두 읽거나 예외가 발생하면 알아서 close 합니다. charset을 지정하지 않으면 utf-8 이 사용됩니다.
오버로딩 메서드로 readString(Path) 존재.
두 Path 가 같은 파일을 가리키면 true, 아니면 false 를 반환한다. 파일이 실제로 존재하지 않아도, Path 를 기준으로 해서 같은 위치면 true 로 판단합니다.
컬랙션의 toArray() 메서드를 오버로딩하는 메서드가 추가되어 원하는 타입의 배열을 선택할 수 있게 되었습니다.
List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");
Predicate 인터페이스에 부정을 나타내는 not 메서드가 추가되었습니다.
#Predicate.java
static <T> Predicate<T> not(Predicate<? super T> target) {
Objects.requireNonNull(target);
return (Predicate<T>)target.negate();
}
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");
람다식에서 var을 사용할 수 있습니다.
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");
(var s1, s2) -> s1 + s2 // 안 됨. s2 에도 var 필요.
(var s1, String y) -> s1 + y // 안 됨. String 과 혼용 불가.
var s1 -> s1 // 안 됨. 괄호 필요.
Java 9에 도입된 HTTP 클라이언트가 표준이 되었습니다. (HTTP/1.1 과 HTTP/2을 지원합니다.)전반적인 HTTP API의 성능이 향상되었습니다.
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!");
중첩클래스들이 접근지정자에 상관없이 서로의 필드에 접근이 가능해졌습니다.
class Test {
static class One {
private int one;
}
static class Two {
private int two;
}
}
javac를 통해 컴파일 하지 않고도, 바로 실행할 수 있게 되었습니다.
# 기존
$ javac HelloWorld.java
$ java HelloWorld Hello Java 8!
# 변경
$ java HelloWorld.java
Hello Java 11!
CONSTANT_Dynamic이라는 새로운 상수 풀 형식을 지원합니다.
기존 문자열 및 배열 내장 함수가 최적화 됐어요.
java.lang.Math 의 sin, cos, log 메서드에 대한 새로운 내장 함수를 구현합니다.
Epsilon이라는 새로운 GC가 실험적으로 나왔습니다.
애플리케이션에서 진단 및 프로파일링 데이터를 수집하는 데 사용할 수 있는 프로파일링 도구가 나왔습니다.
앞으로 EE 나 CORBA 모듈이 필요한 경우 명시적으로 의존을 추가해야합니다.
FX 라이브러리가 OpenJFX 프로젝트로 옮겨가면서 코어에서 삭제되었습니다.