오늘의 나보다 성장한 내일의 나를 위해…
다음 당근 페이 질문은 아래와 같다.
Q: 어떤 버전의 자바를 쓰시고 계신가요?
A: java 11 버전을 쓰고 있습니다.
Q: java 11 버전에 추가된 것엔 어떤 것들이 있나요?
참 당혹스러운 질문이다… 사실 팀이랑 버젼을 맞추기 위해 LTS 버젼으로 맞춘건데 java 11에는 뭐가 추가됐냐니… 그래도 java 8에는 뭐가 추가 됐는지는 대충 안다. Nashorn, Stream API, Lambda 가 추가된 걸로 아는데 java 11은 아무것도 모르겠다.. 그래서 이번 기회에 java 11에서 추가된 것을 적어보자.
Java 11은 Java 8 이후 첫 번째 LTS (장기 지원) 릴리스이다. Oracle도 2019년 1월 Java 8 지원을 중단 했다. 결과적으로 많은 사람들이 Java 11로 업그레이드하는 결과를 가져왔다.
개발자 측면
새로운 문자열 메서드
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(): 문자열 뒤의 공백 제거
여기서 strip이 trime과 다를 게 없다고 생각할 수 있으나 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) => 커서의 위치를 앞으로 이동
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!'
새 파일 방법
이제 파일에서 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");
컬렉션을 배열로 수집하기
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을 사용할 수도 있다는 것 입니다.
또 여러 가지 개발자 측면에서 바뀐 게 있지만 여기까지만 설명하고 다음으로 측면으로 넘어가보자. 추가적인 것은 이 링크를 참조한다.
성능 향상
새로운 가비지 컬렉터
ZGC: A Scalable Low-Latency Garbage Collector (Experimental)
성능을 향상시킨 새로운 가비지 컬렉터이다. 메모리를 자동으로 정리해주는 GC는 자바의 장점 중 하나지만 GC가 동작할 때 JVM이 애플리케이션을 멈추기 때문에 어떻게 보면 단점이다. ZGC는 이 시간을 10ms 미만으로 줄이고 15% 이하의 성능 패널티를 목표로 한다.
Flight Recorder
Flight Recorder는 자바 애플리케이션과 HotSpot JVM의 문제 해결을 위한 오버헤드가 낮은 데이터 수집 프레임워크이다.
사라진 기능
사라진 기능도 간단하게 살펴보겠다.
- Java EE and CORBA Modules : 앞으로 EE 나 CORBA 모듈이 필요한 경우 명시적으로 의존을 추가해야 합니다.
- Web Start : 특별한 대안 없이 삭제되었습니다.
- Applets : 한동안 대부분 deprecated 되었다가 완전히 삭제되었습니다.
- JavaFX : FX 라이브러리가 OpenJFX 프로젝트로 옮겨가면서 코어에서 삭제되었습니다.
기타
TLS 1.3
TLS의 새로운 버전을 구현
람다에서의 var 변수
자바 10에서 도입된 var 타입 추론을 업데이트
새로운 표준 HTTP 라이브러리
HTTP Clinet(Standard). java.net.http 패키지의 새로운 모듈로 flow 기반의 HTTP/1.1과 HTTP/2를 지원합니다. 자바 9과 자바 10에서 사용되었던 jdk.incubator.http 패키지가 표준화되어 java.net.http 패키지로 추가되었습니다.
Nest 기반 접근 제어
Nest는 접근 제어 컨텍스트로 논리적으로는 같은 클래스를 분리된 클래스로 컴파일할 수 있게 해줍니다. 그러면 다른 클래스의 private 멤버에 getter/setter 없이 바로 접근 가능합니다. 여러 클래스를 하나의 클래스처럼 묶어줄 수 있는 기술로 보입니다.