Java의 새로운 기능

Java 11의 새로운 기능

늦깎이_개발자 2024. 6. 4. 06:36
반응형

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!

 

 

※ 참조

https://www.baeldung.com/java-11-new-features

반응형