[Java] Java 9 특징
글 작성자: SeoArc
Java SE 9
2017년 9월에 공개했으며 Project Jigsaw 기반으로 런타임이 모듈화된 것이 가장 큰 특징이다. 이에 따라 대부분의 콘솔 프로그램 개발에는 더 이상 AWT나 Swing 같은 불필요한 라이브러리를 끌어쓸 필요 없이, 최상위 모듈인 Base만 사용해도 되게 되었다. 더불어 특정 프로그램에 최적화된 최소 런타임을 제작할 수 있게 되면서 패키징도 간편해졌다.
Jigsaw 모듈 시스템
module java.sql {
requires public java.logging;
requires public java.xml;
exports java.sql;
exports javax.sql;
exports javax.transaction.xa;
}
jigsaw 프로젝트의 목표는 다음과 같다.
- 라이브러리와 규모가 큰 시스템을 모듈화하고 강력한 접근 제어
- 캡슐화를 통한 느슨한 결합으로 유지관리성 향상
- 불필요하고 비인가된 모듈 간 결합을 방지하여 모듈의 올바른 사용을 유도
- 보안성 향상
- 성능 최적화: JPMS(Java Platform Module System)의 일환으로 JRE를 작은 단위의 모듈들로 쪼갰다. 이 덕분에 애플리케이션에서 실제로 사용하는 모듈만 패키징하여 배포할 수 있다.
Jigsaw 주는 이점은 다음과 같다.
- 편하고 효율적인 Java 개발 환경을 만들 수 있다.
- Jar 기반 모노리틱 방식을 개선하여 모듈 지정 및 모듈별 버전 관리 기능이 가능하다.
- 필요한 모듈만 구동하여 크기와 성능 최적화가 가능하다.
- 임베디드와 같은 환경에서 필요한 모듈만 탑재되어 적은 메모리로 로딩이 가능하다.
Interface Private Method
인터페이스 내에서 private method 사용이 가능해졌다.
interface MyInterface {
default void check() {
String result = staticPrivate();
MyInterface myI = new MyInterface() {
// 익명 클래스
};
result = myI.instancePrivate();
}
private static String staticPrivate() {
return "static private";
}
private String instancePrivate() {
return "instance private";
}
}
Reactive Stream API 추가
Reactive Stream을 구현한 Flow API가 추가되었다.
java.util.concurrent.Flow
java.util.concurrent.Flow.Publisher
java.util.concurrent.Flow.Subscriber
java.util.concurrent.Flow.Processor
Optional To Stream
Stream<Optional> person = getPerson(id);
// Optional.stream()은 Stream<Optional>을 Stream<Person>으로 바꾸어준다.
Stream personStream = person.flatMap(Optional::stream);
// Optional로 Stream을 생성할 수 있다.
Stream<Integer> stream = Optional.of(1).stream();
Stream API 개선
- iterate와 같이 Predicate를 받을 수 있는 인터페이스가 추가되었다.
IntStream.iterate(1, i -> i < 100, i -> i + 1)
.forEach(System.out::println);
- dropWhile, takeWhile, ofNullable의 스트림 메서드가 추가되었다.
HTTP2 Client
- HttpURLConnection을 대체
- jdk.incubator.http 패키지 추가
- HTTP/1.1, HTTP/2 프로토콜 지원
- Apache HttpClient, Netty, Jetty와 비교할 수 있는 성능
- 동기/비동기 모드 지원
[동기 호출]
HttpResponse reponse = HttpRequest.create(new URI("http://www.test.com"))
.body(noBody())
.GET().send();
int responseCode = response.responseCode();
String responseBody = response.body(asString());
System.out.println(responseBody);
[비동기 호출]
HttpRequest request = HttpRequest.create(new URI("http://www.test.com"))
.body(noBody())
.GET();
CompletableFuture<HttpResponse> future = request.sendAsync();
Thread.sleep(10);
if (!future.isDone()) {
future.cancel(true);
System.err.println("timeout");
return;
}
HttpResponse response = future.get();
이 외 변경 사항은 다음과 같다.
- Java를 인터프리터 언어 shell 처럼 사용할 수 있는 JShell 추가
- Deprecated 표시에 해당 버전과 제거 예정 여부를 표시할 수 있도록 변경
- Multi-Resolution Image API 추가
- Multi-release JARs
- 구조적 불변 컬렉션
- 통합 로깅
- HTML5 Javadoc
- 프로퍼티 파일에 UTF-8 지원
- GC 개선
- Diamond Operator 개선
- anonymous inner class에서 diamond operator를 사용할 수 있음
새로 적용된 버저닝 정책에 따라 이 버전부터는 1.x 버전이 아닌 9.0으로 내놓았다. 또 제거 예정인 Deprecated API는 다음 버전인 Java SE 10부터 완전 삭제 예정이므로 해당 API를 쓰는 프로그램은 이후 버전에서 컴파일이 되지 않는다.
이 버전 부터는 6개월마다 새로운 버전이 업데이트된다.
'Language > Java' 카테고리의 다른 글
[Java] Java 버전 별 특징 (2) | 2023.04.14 |
---|---|
[Java] Java 11 특징 (0) | 2023.04.13 |
[Java] Java 8 특징 (0) | 2023.04.13 |
[Java] 숫자형 스트림 (0) | 2023.04.11 |
[Java] 스트림 연산 (0) | 2023.04.07 |
댓글
이 글 공유하기
다른 글
-
[Java] Java 버전 별 특징
[Java] Java 버전 별 특징
2023.04.14 -
[Java] Java 11 특징
[Java] Java 11 특징
2023.04.13 -
[Java] Java 8 특징
[Java] Java 8 특징
2023.04.13 -
[Java] 숫자형 스트림
[Java] 숫자형 스트림
2023.04.11