BackEnd/Java

Java 11. 주요 변경 내용

hanseom 2024. 12. 6. 23:00
반응형

  Java 11은 Java 10이 출시된지 6개월 후인 2018년 9월에 출시된 LTS 버전입니다.

 

var

  Java 10에서 등장한 var을 람다식 매개변수에 적용 가능하게 되었습니다.

// String 타입을 명시적으로 작성해 준 람다식입니다.
Consumer<String> c1 = (String x) -> System.out.println(x);

// Java 11부터 람다식에 var을 사용할 수 있습니다.
Consumer<String> c2 = (var x) -> System.out.println(x);

 

String 클래스 업데이트

strip()

  띄어 쓰기 혹은 탭 같은 white space를 앞 뒤로 제거해주는 함수입니다.

  • stripLeading(): 앞 부분의 white space만 제거
  • stripTrailing(): 뒷 부분의 white space만 제거
  public static void stripExample() {
    String str = "   A BC ";
    System.out.println(str.strip());
  }

 

isBlank()

  특정 문자열이 white space로만 구성되어 있다면 true를 반환합니다.

 

lines()

  개행 문자를 기준으로 문자열을 쪼개 Stream<String>을 반환합니다.

  public static void linesExample() {
    String str = "A\nB";
    str.lines()
        .forEach(System.out::println);
  }

 

repeat()

  반복 횟수를 파라미터로 받아 주어진 문자열을 반복해 새로운 이어붙인 문자열을 반환합니다.

  public static void repeatExample() {
    String str = "A ";
    System.out.println(str.repeat(3));
  }

 

Collection API 업데이트

  기존에는 컬렉션을 배열로 변환하기 위해 배열을 직접 만들어 옮겨야 했습니다.

List<String> strings = List.of("A", "B", "C");

String[] strArray = new String[3];
String[] result = strings.toArray(strArray);



  Java 11에서 추가된 toArray() 함수는 배열 생성자 참조를 사용할 수 있게 되었습니다.

List<String> strings = List.of("A", "B", "C");
String[] result = strings.toArray(String[]::new);

 

Predicate

  주어진 조건을 반대로 전환할 수 있는 기능이 추가되었습니다.

List<String> strings = List.of("A", " ", "  ");

List<String> result = strings.stream()
  .filter(Predicate.not(String::isBlank))
  .collect(Collectors.toList());

 

Files 클래스 업데이트

  파일 내용 전체를 문자열로 읽어 들이거나 문자열 전체를 파일에 써야 할 때 유용한 기능이 추가되었습니다. 다음은 readString() 메소드를 사용하여 Path를 받아 파일의 전체 내용을 문자열로 읽어 들이는 코드입니다. 문자열 전체를 특정 Path에 쓸 경우에는 writeString() 메소드를 사용하면 됩니다.

  public static void readStringExample() throws Exception {
    var path = Paths.get(Paths.get(".").toAbsolutePath() + "/xxx-api/test.txt");
    String str = Files.readString(path);
    System.out.println(str);
  }

 

새로운 Http Client

  Java를 이용해 HTTP 요청을 주고 받아야 할 때 사용할 수 있는 API입니다. Java 9에서 인큐베이팅 모듈로 등장하고, Java 11에서 표준 모듈로 인정되었습니다.

 

기존 Http Client- HttpUrlConnection

  • HTTP/2.0, HTTP/1.1 지원 불가능
  • 비동기 처리 불가능
  • 사용하거나 유지보수하는 것이 매우 어려움

  그래서 Java에서 HTTP Client가 필요한 경우, apache HttpClient, OkHttp, Jetty HttpClient 등 외부 라이브러리를 가져와 사용하였습니다.

 

새로운 Http Client 특징

  • HTTP/2.0, HTTP/1.1 지원
  • WebSocket 지원
  • CompletableFuture를 이용한 비동기 매커니즘 지원
  • 람다와 같은 새로운 언어 시스템에 우호적

 

핵심 객체

  • HttpRequest
  • HttpResponse<T>
  • HttpClient

  다음은 동기 방식으로 HttpClient를 사용한 예제 코드입니다.

  public static void httpClientSyncExample() throws Exception {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/get"))
        .GET()
        .build();
    HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
    printlnWithThread(response.statusCode());
    printlnWithThread(response.body());
    client.close();
  }
  
  private static void printlnWithThread(Object obj) {
    System.out.printf("%s %s\n", Thread.currentThread().getName(), obj);
  }

 

  다음은 비동기 방식으로 호출한 예제 코드입니다.

  public static void httpClientAsyncExample() {
    var client = HttpClient.newHttpClient();
    var request = HttpRequest.newBuilder(URI.create("https://postman-echo.com/get"))
        .GET()
        .build();
    client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
        .thenAccept((response) -> {
          printlnWithThread(response.statusCode());
          printlnWithThread(response.body());
        });
    client.close();
  }
반응형