Java8과 Java11 정리

과녁스·2022년 3월 16일
0

Java

목록 보기
7/8
post-thumbnail

개요


Java11에 대하여 학습한 내용을 정리하게 되었습니다.

특징


Java11은 Java8이후로 LTS 릴리즈 입니다. Oracle도 2019 년 1 월 Java 8 지원을 중단하였습니다.

Open JDK 사용

Java11부터는 Oracle JDK가 유료화 되면서 무료로 사용하기 위해서는 OpenJDK를 사용해야 합니다.

기능 추가

String Class 및 Method 추가

String Class와 관련하여 여러 메서드가 추가되었습니다.

  • isBlank : 문자열이 비어있거나 공백만 포함되어 있을 경우 true 를 반환
  • lines : 문자열을 라인 단위로 쪼개는 스트림을 반환
  • strip : 문자열 앞, 뒤의 공백 제거
  • stripLeading : 문자열 앞의 공백 제거
  • stripTrailing : 문자열 뒤의 공백 제거
  • repeat : 지정된 수 만큼 문자열을 반복하여 붙여 반환
String multilineString = "My name \n \n is \n Jass.";

List<String> lines = multilineString.lines().filter(line -> !line.isBlank())
.map(String::strip)
.collect(Collectors.toList()); 

assertThat(lines).containsExactly("My name", "is", "Jass");

File 클래스, 메서드 추가

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

assertThat(fileContent).isEqualTo("Sample text");

Path writeString(Path, String, Charset, OpenOption)

파일에 문자열을 작성하고 Path로 반환한다. 파일 오픈 옵션에 따라 작동 방식을 달리하며, charset을 지정하지 않으면 utf-8 이 사용됩니다.

오버로딩 메서드로 writeString(Path, String, OpenOption) 존재

String readString(Path, Charset)

파일 전체 내용을 읽어서 String으로 반환하고, 파일 내용을 모두 읽거나 예외가 발생하면 알아서 close 합니다. charset을 지정하지 않으면 utf-8 이 사용됩니다.

오버로딩 메서드로 readString(Path) 존재.

boolean isSameFile(Path, Path)

두 Path 가 같은 파일을 가리키면 true, 아니면 false 를 반환한다. 파일이 실제로 존재하지 않아도, Path 를 기준으로 해서 같은 위치면 true 로 판단합니다.

컬랙션 인터페이스, 메서드 추가

컬랙션의 toArray() 메서드를 오버로딩하는 메서드가 추가되어 원하는 타입의 배열을 선택할 수 있게 되었습니다.

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

assertThat(sampleArray).containsExactly("Java", "Kotlin");

Predicate 인터페이스, static not 메서드 추가

Predicate 인터페이스에 부정을 나타내는 not 메서드가 추가되었습니다.

#Predicate.java
static <T> Predicate<T> not(Predicate<? super T> target) { 	
	Objects.requireNonNull(target);
	return (Predicate<T>)target.negate();
}
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");

람다에서 로컬 변수 Var 사용

람다식에서 var을 사용할 수 있습니다.

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");
(var s1, s2) -> s1 + s2 // 안 됨. s2 에도 var 필요.
(var s1, String y) -> s1 + y // 안 됨. String 과 혼용 불가.

var s1 -> s1 // 안 됨. 괄호 필요.

HTTP Client

Java 9에 도입된 HTTP 클라이언트가 표준이 되었습니다. (HTTP/1.1 과 HTTP/2을 지원합니다.)전반적인 HTTP API의 성능이 향상되었습니다.

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

Nest-Based Access Control

중첩클래스들이 접근지정자에 상관없이 서로의 필드에 접근이 가능해졌습니다.

class Test {
	static class One {
    	private int one;
    }
    
    static class Two {
    	private int two;
    }
}

자바 파일 실행

javac를 통해 컴파일 하지 않고도, 바로 실행할 수 있게 되었습니다.

# 기존

$ javac HelloWorld.java
$ java HelloWorld Hello Java 8!
# 변경

$ java HelloWorld.java
Hello Java 11!

성능향상

동적 클래스 파일 상수

CONSTANT_Dynamic이라는 새로운 상수 풀 형식을 지원합니다.

개선된 Aarch64

기존 문자열 및 배열 내장 함수가 최적화 됐어요.
java.lang.Math 의 sin, cos, log 메서드에 대한 새로운 내장 함수를 구현합니다.

새로운 GC

Epsilon이라는 새로운 GC가 실험적으로 나왔습니다.

JFR

애플리케이션에서 진단 및 프로파일링 데이터를 수집하는 데 사용할 수 있는 프로파일링 도구가 나왔습니다.

삭제

Java EE and CORBA

앞으로 EE 나 CORBA 모듈이 필요한 경우 명시적으로 의존을 추가해야합니다.

JMC and JavaFX

FX 라이브러리가 OpenJFX 프로젝트로 옮겨가면서 코어에서 삭제되었습니다.

Deprecated

Nashorn JavaScript engine

Pack200 compression scheme for JAR files

출처🙏

profile
ㅎㅅㅎ

0개의 댓글