Java

자바 11에서의 작은 변경 사항

AlbertIm 2024. 12. 2. 22:55

시작

The Well-Grounded Java Developer 책을 읽으면서 책 내용 기반으로 자바 11에서의 작은 변경 사항을 정리합니다.

본문

var 키워드를 지원하는 지역 변수 타입 추론

var 키워드를 사용하여 지역 변수의 타입을 추론할 수 있습니다.

var example = "Hello, Java 11!";

example.getClass();
$1 ==> class java.lang.String

컬렉션 팩토리(JEP 213)

List

Listof() 메서드가 추가하여 불변 리스트를 쉽게 생성할 수 있습니다.

var listExample = List.of(1,2,3);
listExample ==> [1, 2, 3]

listExample.getClass();
$3 ==> class java.util.ImmutableCollections$ListN

Set

Setof() 메서드가 추가되어 불변 Set을 쉽게 생성할 수 있습니다.

var setExample = Set.of(1,2,3);
setExample ==> [2, 3, 1]

setExample.getClass();
$4 ==> class java.util.ImmutableCollections$SetN

Map

Map에도 of() 메서드가 추가되어 불변 Map을 쉽게 생성할 수 있습니다.

var mapExample = Map.of(1, "one", 2, "two", 3, "three");
mapExample ==> {2=two, 3=three, 1=one}

mapExample.getClass();
$5 ==> class java.util.ImmutableCollections$MapN

 

뿐만 아니라 복잡한 Map을 생성할 때 ofEntries() 메서드를 사용할 수 있습니다.

var mapExample2 = Map.ofEntries(
    Map.entry(1, "one"), 
    Map.entry(2, "two"), 
    Map.entry(3, "three"));
mapExample2 ==> {2=two, 3=three, 1=one}
$11 ==> class java.util.ImmutableCollections$MapN

HTTP/2(자바 11)를 지원하는 HttpClient 추가

HttpClient를 사용하여 HTTP/2를 지원합니다.

 

동기적으로 HTTP 요청을 보내고 응답을 받는 예제입니다. 하나의 요청과 응답만 받습니다.

// 요청을 위한 HttpClient 생성
var client = HttpClient.newBuilder().build();

var uri = new URI("https://google.com");

// HttpRequest 인스턴를 생성
var request = HttpRequest.newBuilder(uri).build();

// HTTP 요청을 동기적으로 실행해서 그 응답을 저장한다.
var response = client.send(
    request, 
    // send 메서드는 응답 본문을 처리할 표준 BodyHandler를 요구한다.
    HttpResponse.BodyHandlers.ofString(
        Charset.defaultCharset()));

System.out.println(response.body());

 

비동기적으로 HTTP 요청을 보내고 응답을 받는 예제입니다. 여러 응답을 받습니다.

// 요청을 위한 HttpClient 생성
var client = HttpClient.newBuilder().build();

var uri = new URI("https://google.com");

// HttpRequest 인스턴를 생성
var request = HttpRequest.newBuilder(uri).build();

var handler = HttpResponse.BodyHandlers.ofString();

// HTTP 요청을 비동기적으로 실행해서 그 응답을 저장한다.
CompletableFuture.allOf(
    // 동일한 HttpClient 인스턴스를 사용하여 여러 요청을 보낼 수 있다.
    client.sendAsync(request, handler)
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println),
    client.sendAsync(request, handler)
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println),
    client.sendAsync(request, handler)
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println)
).join();

단일 소스 코드 프로그램

java에서도 스크립트 언어처럼 단일 소스 코드 프로그램을 실행할 수 있습니다.

예를 들어 HelloWorld.java 파일을 생성하고 다음과 같이 작성합니다.

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java 11!");
    }
}

 

그리고 다음과 같이 실행합니다.

$ java HelloWorld.java

결과=> Hello, Java 11!

하지만 다음과 같은 몇 가지 제약이 있습니다.

  • 단일 소스 파일에 있는 코드로 제한됩니다.
  • 동일한 실행에서 추가적인 소스 파일을 참조할 수 없습니다.
  • 소스 파일에 여러 클래스를 포함할 수 있다.
  • 소스 파일에서 첫 번째 클래스를 진입점으로 선언해야 한다.
  • 진입점 클래스에서 main 메서드를 선언해야 한다.

또 자바 스크립트는 다음과 같이 셔뱅라인을 포함할 수도 있습니다.

#!/usr/bin/java --source 11

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, Java 11!");
    }
}

마무리

이로 인해 자바 11에서의 작은 변경 사항을 정리했습니다. 모든 변경 사항을 다루지는 않았지만, 이러한 변경 사항들이 자바 11을 사용하는 것을 더욱 편리하게 만들어줍니다.

참조