오늘의 나보다 성장한 내일의 나를 위해…













다음 당근 페이 질문은 아래와 같다.

Q: 어떤 버전의 자바를 쓰시고 계신가요?

A: java 11 버전을 쓰고 있습니다.

Q: java 11 버전에 추가된 것엔 어떤 것들이 있나요?


참 당혹스러운 질문이다… 사실 팀이랑 버젼을 맞추기 위해 LTS 버젼으로 맞춘건데 java 11에는 뭐가 추가됐냐니… 그래도 java 8에는 뭐가 추가 됐는지는 대충 안다. Nashorn, Stream API, Lambda 가 추가된 걸로 아는데 java 11은 아무것도 모르겠다.. 그래서 이번 기회에 java 11에서 추가된 것을 적어보자.


Java 11Java 8 이후 첫 번째 LTS (장기 지원) 릴리스이다. Oracle도 2019년 1월 Java 8 지원을 중단 했다. 결과적으로 많은 사람들이 Java 11로 업그레이드하는 결과를 가져왔다.


:pushpin: 개발자 측면


:pushpin: 새로운 문자열 메서드

Java 11은 몇 가지 새로운 메서드를 String 클래스에 추가한다

  • isBlank(): 문자열이 비어있거나 공백만 포함되어 있을 경우 true를 반환한다. 즉, String.trim().isEmpty() 호출 결과와 같다.


  • lines(): 문자열을 라인 단위로 쪼개는 스트림을 반환한다.

Example

import java.io.IOException;
import java.util.stream.Stream;

public class Main
{
    public static void main(String[] args)
    {
        try
        {
            String str = "A \n B \n C \n D";

            Stream<String> lines = str.lines();

            lines.forEach(System.out::println);
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
    }
}


결과


  • repeat(n): 지정된 수 만큼 문자열을 반복하여 붙여 반환한다


Example

String str = "ABC";
String repeated = str.repeat(3);	// "ABCABCABC"


  • strip: 문자열 앞, 뒤의 공백 제거
  • stripLeading(): 문자열 앞의 공백 제거
  • stripgTrailing(): 문자열 뒤의 공백 제거


여기서 striptrime과 다를 게 없다고 생각할 수 있으나 trim은 ‘\u0020’ 이하의 공백들만 제거한다. strip은 유니코드의 공백들을 모두 제거한다.


사실 유니코드에는 우리가 일반적으로 많이 사용하는 스페이스(‘\u0020’), 탭(‘\u0009) 등 외에도 더 많은 종류의 공백 문자들이 있습니다. strip() 메소드는 trim() 보다 더 많은 종류의 공백을 제거할 수 있습니다. 보통 whitespace라고 하면 간단하게 tab 문자(U+0009), 공백(U+0020), CR(U+000D), LF(U+000A) 등이 있다.

라인피드(LF : Line Feed) => 현재 위치에서 바로 아래로 이동

캐리지리턴(CR: Carriage return) => 커서의 위치를 앞으로 이동


자바에서 String.format()를 쓸 때 줄바꿈을 하기 위해 \n으로 쓰게 되는데 이렇게 쓰면 어떤 OS에서는 제대로 작동하지 않을 수가 있다. 예를 들어 윈도우/DOS 에서는 CRLF 조합으로 줄바꿈을 정의하는 반면에 Unix/Linux/C는 LF 만으로 줄바꿈을 정의한다. 그럼으로 \n으로 줄바꿈을 하는 것보다 System.lineSeparator()를 쓰는 것을 추천한다.


Example

public class StringSpace {
  public static void main(String[] args) {
    // 앞뒤로 공백이 있는 문자열
    String str = "\u2003Hi Anna!\u2003";
    // 공백 제거
    String trimStr = str.trim();
    String stripStr = str.strip();
    // 공백 제거 문자열 출력
    System.out.println("원본 문자열 : '" + str + "'");
    System.out.println("trim 문자열 : '" + trimStr + "'");
    System.out.println("strip 문자열 : '" + stripStr + "'");
  }
}


결과

원본 문자열 : ' Hi Anna! '
trim 문자열 : ' Hi Anna! '
strip 문자열 : 'Hi Anna!'


:pushpin: 새 파일 방법

이제 파일에서 String을 읽고 쓰는 것이 더 쉬워졌다. File 클래스에서 새로운 readString 및 writeString 정적 메서드를 사용할 수 있기 때문이다.


Example

Path filePath = Files.writeString(Files.createTempFile(tempDir, "demo", ".txt"), "Sample text");
String fileContent = Files.readString(filePath);
assertThat(fileContent).isEqualTo("Sample text");


:pushpin: 컬렉션을 배열로 수집하기

java.util.Collection은 새로운 디폴트 메서드로 toArray가 생겼다. 이것은 컬렉션을 배열로 쉽게 변환시켜 준다.


Example

List sampleList = Arrays.asList("Java", "Kotlin");
String[] sampleArray = sampleList.toArray(String[]::new);
assertThat(sampleArray).containsExactly("Java", "Kotlin");


1-4. Not 술어 메서드

Predicate 인터페이스에 정적 not 메서드가 추가되었다. negate 메서드와 같이 기존 술어를 부정하는데 사용할 수 있다.

Example

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");

not (isBlank)isBlank .negate() 보다 더 자연스럽게 읽는 반면 , 큰 장점은 not (String : isBlank)와 같은 메소드 참조와 함께 not을 사용할 수도 있다는 것 입니다.


또 여러 가지 개발자 측면에서 바뀐 게 있지만 여기까지만 설명하고 다음으로 측면으로 넘어가보자. 추가적인 것은 이 링크를 참조한다.


:pushpin: 성능 향상


:pushpin: 새로운 가비지 컬렉터

ZGC: A Scalable Low-Latency Garbage Collector (Experimental)


성능을 향상시킨 새로운 가비지 컬렉터이다. 메모리를 자동으로 정리해주는 GC는 자바의 장점 중 하나지만 GC가 동작할 때 JVM이 애플리케이션을 멈추기 때문에 어떻게 보면 단점이다. ZGC는 이 시간을 10ms 미만으로 줄이고 15% 이하의 성능 패널티를 목표로 한다.


:pushpin: Flight Recorder

Flight Recorder는 자바 애플리케이션과 HotSpot JVM의 문제 해결을 위한 오버헤드가 낮은 데이터 수집 프레임워크이다.


:pushpin: 사라진 기능


사라진 기능도 간단하게 살펴보겠다.

  • Java EE and CORBA Modules : 앞으로 EE 나 CORBA 모듈이 필요한 경우 명시적으로 의존을 추가해야 합니다.
  • Web Start : 특별한 대안 없이 삭제되었습니다.
  • Applets : 한동안 대부분 deprecated 되었다가 완전히 삭제되었습니다.
  • JavaFX : FX 라이브러리가 OpenJFX 프로젝트로 옮겨가면서 코어에서 삭제되었습니다.

:pushpin: 기타

:pushpin: TLS 1.3

TLS의 새로운 버전을 구현


:pushpin: 람다에서의 var 변수

자바 10에서 도입된 var 타입 추론을 업데이트


:pushpin: 새로운 표준 HTTP 라이브러리

HTTP Clinet(Standard). java.net.http 패키지의 새로운 모듈 flow 기반의 HTTP/1.1과 HTTP/2를 지원합니다. 자바 9과 자바 10에서 사용되었던 jdk.incubator.http 패키지가 표준화되어 java.net.http 패키지로 추가되었습니다.


:pushpin: Nest 기반 접근 제어

Nest는 접근 제어 컨텍스트로 논리적으로는 같은 클래스를 분리된 클래스로 컴파일할 수 있게 해줍니다. 그러면 다른 클래스의 private 멤버에 getter/setter 없이 바로 접근 가능합니다. 여러 클래스를 하나의 클래스처럼 묶어줄 수 있는 기술로 보입니다.


YoungKyonYou

Integration of Knowledge