Java 12

 

언어 상 변화

Switch Expressions (JEP 325)

- preview feature

before:

int numLetters;
switch (day) {
	case MONDAY:
	case FRIDAY:
	case SUNDAY:
		numLetters = 6;
		break;
	case TUESDAY:
		numLetters = 7;
		break;
	case THURSDAY:
	case SATURDAY:
		numLetters = 8;
		break;
	case WEDNESDAY:
		numLetters = 9;
		break;
	default:
		throw new IllegalStateException("Huh? " + day);
}

after:

int numLetters = switch (day) {
	case MONDAY, FRIDAY, SUNDAY -> 6;
	case TUESDAY -> 7;
	case THURSDAY, SATURDAY -> 8;
	case WEDNESDAY -> 9;
	default -> throw new IllegalStateException("Huh? " + day);
};

 

라이브러리 변화

Teeing Collectors

- Collectors.teeing(Collector, Collector, BiFunction)

- 1, 2 번 아규먼트 컬렉터의 연산 결과를 BiFunction 아규먼트로 넘겨 BiFunction 이 최종 컬렉팅을 수행한다:

double mean = Stream.of(1, 2, 3, 4, 5)
                .collect(Collectors.teeing(
                        summingDouble(i -> i),
                        counting(),
                        (sum, n) -> sum / n));

System.out.println(mean); // 3

 

InputStream.skipNBytes(n)

- 정확히 n 만큼의 바이트를 스킵함.

- n <= 0 이면 스킵하지 않음.

 

java.lang.constant 패키지 추가

 

java.lang.Character

- 체스 심볼 추가

- 마야 숫자 표현 추가

- 소그디니아어 추가

 

java.lang.Class 메서드 추가

- arrayType(): 해당 클래스의 array type 클래스를 반환:

jshell> "foo".getClass().arrayType()
$15 ==> class [Ljava.lang.String;

- componentType(): 기존 getComponentType()과 동일?

- descriptorString(): java.lang.Class에 TypeDescriptor 인스페이스 구현이 추가되어 이 메서드를 오버라이딩함. 현재 getName()과 동일한 결과를 반환함.

 

java.lang.String 메서드 추가

- indent(n): 들여쓰기 수행. 아래 과정으로 처리된다:

Step 1. String.lines() 를 통해 라인을 쪼갠다.

Step 2. n > 0 이면 라인마다 n 만큼의 공백을 추가한다. n < 0 이면 n 라인마다 만큼의 공백을 제거한다. 공백이 없으면 제거하지 않는다. n == 0 이면 그냥 둔다.

Step 3. 라인을 모두 합친다. (줄바꿈 문자열은 유지한다.)

 

- transform(Function<String>): 문자열에 Function을 실행한 결과를 반환한다:

hello".transform(input -> input + " world!"); // "hello world!"

 

java.net.SecureCacheResponse, java.net.ssl.HttpsConnection 메서드 추가

- Optional<SSLSession> getSSLSession(): 현재 커넥션의 SSL 세션을 반환.

 

long java.nio.files.Files.mismatch(Path, Path)

- 두 파일 내용을 바이트로 비교하여 처음 차이가 발견된 바이트의 위치를 반환한다. 차이가 발견되지 않으면 -1L을 반환한다.

 

java.text.CompactNumberFormat

- NumberFormat의 서브클래스로, 1,000,000 => 1M 으로 변환하는 등의 포맷팅을 수행한다.

 

java.util.concurrent.CompletionStage 메서드 추가

- ComplitionStage<T> exceptionallyAsync(Function<Throwable, ? extends T>): CompletableFuture.supplyAsync() 에서 발생한 에러를 비동기로 핸들링한다.

- ComplitionStage<T> exceptionallyAsync(Function<Throwable, ? extends T> Executor executor): 기능은 위와 같음. 비동기 에러 핸들링을 수행할 Executor를 지정한다.

- ComplitionStage<T> exceptionallyCompose(Function<Throwable, ? extends CompletionStage<T>>): CompletableFuture.supplyAsync() 에서 에러가 발생하면 Function 을 수행한다. 이 Function 에서 반환한 CompletableStage 는 다음 수행 Future 가 된다. 

- ComplitionStage<T> exceptionallyComposeAsync(Function<Throwable, ? extends CompletionStage<T>>): 기능은 위와 같음. 비동기로 수행한다.

- ComplitionStage<T> exceptionallyComposeAsync(Function<Throwable, ? extends CompletionStage<T>>, Executor): 기능은 위와 같음. 이 로직을 수행할 Executor를 지정한다.

 

javax.crypto.Cipher.toString()

- 암호화 모드, 알고리즘 등에 대한 정보를 제공하도록 변경됨.

 

javax.naming.ldap.spi 패키지 클래스 두 개 추가

- LdspDnsProvider: LDAP DNS 룩업을 위한 서비스 프로바이더.

- LdapDnsProviderResults: LDAP DNS 룩업 결과를 캡슐화.

 

File[] javax.swing.filechooser.FileSystemView.getChooserShortcutPanelFiles()

- 스윙 파일 선택기 창의 숏컷 패널의 파일(디렉토리) 정보를 java.io.File 배열로 반환

 

JVM 변화

JEP 189: Shenandoah

- OpenJDK 에 포함됨

 

JEP 344: Abortable Mixed Collections for G1

- G1 GC는 힙 공간을 2048개의 regions로 나누고, 각 영역은 youg과 old 로 논리적으로 구분된다. G1 GC는 가비지 컬렉션을 수행하기 위해 수행 대상 regions를 선택하는데 (collection set), young과 old가 섞이게 되는 mixed collections에서 old regions가 너무 많이 잡히게 되면 pause time이 길어져 목표치를 초과하게 될 수 있다. 이를 방지하기 위해서는 G1 GC가 collection set을 만드는 과정에서 잘못된 수의 regions을 반복적으로 select하는 때를 감지하여 실제 가비지 컬렉션 과정 중간에 작동을 취소할 수 있게끔 해야 한다 (aborable).

 

위 목표를 실현하기 위해 Java 12 의 G1 GC는 잘못된 수의 regions가 반복적으로 select됨을 감지하면 더욱 점진적인 mixed collections 과정을 취한다: collection set을 mandatory part, optional part 둘로 나눈다. mandatory part는 young regions와 같이 G1 GC가 점진적 처리를 할 수 없는 영역으로 구성하지만, 효율성을 위해 old regions도 포함할 수 있다.

그리고 나머지는 old regions로만 구성된 optional part가 된다. 이 과정의 결과로 collection set은, 예를 들어 80%의 mandatory part, 20%의 optional part와 같이 나뉘게 된다.

 

우선 mandatory part의 가비지 컬렉션을 마치고 optional part에 대해서는 훨씬 더 세분화된 방법을 취한다. pause time 여유가 남아 있다면 그 시간에 비례하여 old regions를 처리하는데, 최대 한 번에 한 old region씩 처리한다. 처리 도중 남은 시간이 없다면 처리 중인 region까지만 작업을 마치고 다음 가비지 컬렉션을 중단한다(abort).

 

mandatory part을 다시 구성할 때 까지, 위 과정이 반복되면서 optional part는 점점 작아지게 된다. 그러다 다시 collection set을 나누게 되면 mandatory part와 optional part를 새로 만든다.

 

JEP 346: Promptly Return Unused Committed Memory from G1

- 기존 G1 GC에는 시간에 따른 JVM 메모리 릴리즈가 없었다. 기존 G1 GC가 OS에 메모리를 반환하는 때는 full GC or concurrent GC cycle 이다. 그런데 G1 GC는 full GC를 최대한 피하도록 설계되었고, concurrent GC cycle은 힙 메모리 사용량과 할당 작업에서만 작동하기 때문에, 결과적으로 기존 G1 GC는 OS에 메모리를 잘 반환하지 않는다. 그리고 이는 사용 자원에 따라 요금을 부과하는 클라우드 환경에서 불필요한 비용을 초래한다. 어플리케이션이 놀고 있는 때에도 메모리를 잡고 있으니, 사용하지 않는 물건에 대해 요금을 계속 지불하게 되는 것이다.

 

이 문제를 완화하기 위해 Java 12 의 G1 GC는 적절한 시간 안에서 어플리케이션이 사용되지 않는다고 판단되면 사용하지 않는 메모리 일부를 OS에 반환하여 JVM 힙 크기를 조정하도록 한다.

 

JDK 새로운 기능

JEP 230: 마이크로벤치마킹 슈트

- 성능 측정 도구인 Java Microbenchmarking Harness (JMH) 가 OpenJDK에 포함되었다. 

 

JEP 341: Default CDS 아카이브

- 상용 Oracle JDK 의 기능이었던 CDS가 OpenJDK에 포함되었다. CDS를 사용하기 위해 lib/server 디렉토리에 classes.jsa 파일이 생성된다. 

 

 

출처:

https://dzone.com/articles/39-new-features-and-apis-in-jdk-12

https://www.baeldung.com/java12-string-api

https://openjdk.java.net/jeps/344

'Java > Core' 카테고리의 다른 글

Java 14 간략히 정리  (0) 2020.07.16
Java 13 간략히 정리  (0) 2020.07.16
Java 11 간략히 정리  (0) 2020.07.15
Java 10 간략히 정리  (0) 2020.07.15
IO, NIO, NIO2  (0) 2020.02.26

+ Recent posts