Java 13

 

JEP 355: Text Blocks

- preview feature

- String str = """ 문자열 """;

- 멀티라인 문자열을 더 보기 좋고 편하게 작성할 수 있음.

String textBlock = """
		This
		is
		a
		new
		feature,
		Text
		Block!""";
System.out.println(textBlock);
String inline = "\nThis\nis\anew\nfeature,\nText\nBlock!";
System.out.println(textBlock.equals(inline));

output:

This
is
a
new
feature,
Text
Block!
true

줄바꿈 문자가 자동으로 포함된다. 자바 코드로 json, html 텍스트를 작성할 때 아주 편리할 듯.

 

텍스트 블록용 String 메서드 추가

- formatted(Object ...args): String.format() 와 비슷한 기능. 텍스트블록에 사용됨.

- stripIndent(): 문자열 안의 모든 라인에 strip를 적용하여 앞 뒤 공백을 제거함.

- translateEscapes(): 연속된 이스케이프 문자를 변환 - ""\\t" => "\t"

 

JEP 354: Switch Expressions Enhancements

- preview feature

- yield 키워드:

switch(mode) {
	case "a", "b":
		yield 1;
	case "c", "d", "e":
		yield 2;
	default:
		yield -1;
};

- yield 는 값을 반환하고 switch를 빠져나감 (break)

- arrrow 도 여전히 사용 가능.

 

JEP 353: Socket API 재구현

- 신규 클래스 sun.nio.ch.NioSocketImpl 추가되어 java.net.PlainSocketImpl 을 대체함.

- NioSocketImpl 는 내부에서 synchronized 대신 java.util.concurrent 패키지의 locks를 사용함.

- 아래 아규먼트로 Socket API 사용 가능:

-Djdk.net.usePlainSocketImpl

 

JEP 350: Dynamic CDS Archive

- JVM 옵션을 통해 CDS를 더 편하게 사용 가능:

$ java -XX:ArchiveClassesAtExit=my_app_cds.jsa -cp my_app.jar
$ java -XX:SharedArchiveFile=my_app_cds.jsa -cp my_app.jar

 

JEP 351: ZGC:Uncommit Unused Memory

- ZGC가 사용하지 않는 힙 메모리를 OS에 반환하도록 함.

 

static java.nio.file.FileSystems.newFileSystem 메서드 추가

- newFileSystem(Path, ClassLoader)

- newFileSystem(Path, Map<String, ?>)

- newFileSystem(Path, Map<String, ?>, ClassLoader)

 

DOM and SAX Factories with Namespace Support

- newDefaultNSInstance()

- newNSInstance()

- newNSInstance(String, ClassLoader)

 

 

출처: 

https://www.journaldev.com/33204/java-13-features

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

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

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

Java 11

 

새로운 String 메서드 추가

- strip(): 문자열 앞, 뒤의 공백 제거.

- stripLeading(): 문자열 앞의 공백 제거.

- stripTrailing(): 문자열 뒤의 공백 제거.

 

trim() 과의 차이점은, trim() 은 U+0020 이하의 값만을 공백으로 인식하여 제거한다 (tab, CR, LF, 공백). 하지만 유니코드에서는 이 외에 다양한 공백 문자가 존재하는데, 이를 처리하기 위해서는 기존에는 Character.isWhitespace(int) 를 사용해야 했다. Java 11 부터는 strip() 으로 편하게 처리할 수 있다.

 

그리고 성능도 수 배 빠른 것으로 알려짐.

 

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

 

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

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

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

 

java.nio.file.Files 클래스 유틸 메서드 추가

- 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 로 판단한다.

 

Pattern.asMatchPredicate()

- Java 8 의 asPredicate는 matcher().find() 를 사용하는 것에 반해, asMatchPredicate() 는 matcher().match() 를 사용하는 Predicate를 반환한다.

 

Predicate.not(Predicate)

- 인자로 받은 Predicate의 부정형 Predicate를 반환한다.

 

람다 파라미터로 var 사용:

(var n1, var n2) -> n1 + n2

- Java 8 에 등장했으나 Java 10 에서 사라졌다가 Java 11 에서 복귀한 기능.

- 람다는 타입을 스킵할 수 있는데 이걸 사용하는 이유는, @Nullable 등의 어노테이션을 사용하기 위해 타입을 명시해야 할 때.

- var 를 사용하려면 괄호를 써야하며, 모든 파라미터에 사용해야 하고, 다른 타입과 혼용하거나 일부 스킵은 불가능함:

(var s1, s2) -> s1 + s2 // 안 됨. s2 에도 var 필요.
(var s1, String y) -> s1 + y // 안 됨. String 과 혼용 불가.

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

 

Optional.isEmpty()

- Optional이 비어있을 때 true 반환.

 

TimeUnit.convert(Duration)

TimeUnit c = TimeUnit.DAYS;
c.convert(Duration.ofHours(24));	// 2
c.convert(Duration.ofHours(72));	// 3

 

Nest-Based Access Control (JEP 181)

- Java 10 까지 nested 클래스에서 자신, 혹은 outer 클래스의 private 멤버에 리플렉션을 통한 접근을 시도하면 IllegalAccessException 이 발생했고, 이를 피하기 위해 setAccessible(true) 을 호출해야만 했음.

- Java 11 부터는 setAccessible 없이 private 멤버를 호출할 수 있음.

- java.lang.Class 에 다음 메서드들이 추가됨.

- getNestHost(): nested 클래스에서 호출하면 자신을 감싸고 있는 outer 클래스를 반환하고, outer 클래스에서 호출하면 자신을 반환.

- boolean isNestmateOf(Class): 자신이 아규먼트로 받은 Class의 nested 클래스일 때 true 를 반환함.

- Class[] getNestMembers(): 자신을 포함하여 중첩 관계에 있는 모든 클래스를 배열로 반환함. (outer, siblings)

 

Epsilon Garbege Collector (No-Op GC, JEP 318)

- JVM으로 하여금 메모리 할당을 관리하지만, 사용된 메모리를 재사용하지 않도록 함. 메모리를 다 사용하면 OutOfMemory가 발생하고 JVM은 셧다운된다.

- 어플리케이션 테스트에 사용됨. GC는 어플리케이션과 함께 작동하며, 오버헤드가 있어 어플리케이션 성능에 영향을 준다. No-OP GC를 적용하여 GC를 배제함으로써 순수 어플리케이션의 성능, 메모리 부하 등을 테스트할 수 있도록 한다. GC 적용 시의 성능과 비교하여 GC의 영향도를 측정할 수 있다.

- 짧은 시간 수행하고 종료되는 어플리케이션에 사용됨. 간단히 작동하고 마치는, 메모리 부하가 크게 염려되지 않는 어플리케이션에 적절하게 사용될 수 있음.

- 아래 아규먼트를 사용하여 활성화한다:

-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

 

Dynamic Class-File Constants (JEP 309)

 

Java Flight Recorder  (JEP 328)

- 상업용 OracleJDK 에 제공되던 JFR이 OpenJDF에 포함된다.

- Java 어플리케이션으로부터 프로파일링, 어플리케이션 진단 데이터 등을 얻을 수 있음.

- 성능 오버헤드가 1% 미만으로 알려져 있어, 운영 환경에서 사용할 수 있음.

 

HTTP Client (JEP 321)

- Java 표준 HTTP 클라이언트 API.

- 그간 HTTP 통신을 위해 사용된 코드보다 성능이 개선됨.

- HTTP/1.1, HTTP/2, WebSocket을 지원한다. 

 

java 파일 실행 (JEP 330)

- javac를 통한 컴파일 없이 java 파일을 실행할 수 있음:

$> java HelloWorld
Hello world!!

- java 파일에 main 메서드가 존재해야 함.

- 다음과 같이 클래스패스 지정:

java --class-path=/myclasspath ExecutionTest.java

- 클래스패스에 동일한 이름의 클래스가 존재하면 에러 발생. (java 확장자 무시.)

 

 

기타 제거된 기능 및 옵션

com.sun.awt.AWTUtilities 클래스

Lucida 폰트 (Oracle JDK)

appletviewer Launcher

javax.imageio JPEG 플러그인 alpha 이미지 지원 X

sun.misc.Unsafe.defineClass

Thread.destroy()

Thread.stop(Throwable)

JVM-MANAGEMENT-MIB.mib

SNMP 에이전트

JavaFX (Oracle JDK)

Java EE (JAX-WS, JAXB, JAF, Common Anotations) (JEP 320)

CORBA (JEP 320)

 

deprecated된 기능 및 옵션

ThreadPoolExecutor는 Finalization에 의존성을 갖지 않도록 (should not)

Nashorn 자바스크립트 엔진 (JEP 335)

-XX+AggressiveOpts

Pack200 툴 및 API (JEP 336)

스트림 기반 GSSContext 메서드

 

 

출처:

https://dzone.com/articles/features-of-java-11

https://www.journaldev.com/24601/java-11-features

https://www.geeksforgeeks.org/java-11-features-and-comparison/

 

 

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

Java 13 간략히 정리  (0) 2020.07.16
Java 12 간략히 정리  (0) 2020.07.15
Java 10 간략히 정리  (0) 2020.07.15
IO, NIO, NIO2  (0) 2020.02.26
람다  (0) 2020.01.05

+ Recent posts