일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- generate pojos
- CentOS6
- header setting
- 초기 구축
- JavaScript
- spring
- docker
- JPA
- spring boot
- dto valid
- 초기 세팅
- docker 설치
- 리눅스
- jvm
- React
- java8
- custom valid
- Next.js 14
- 도커
- MySQL
- memcached
- jpa entity자동
- SpringBoot
- generate entity
- 헤더 설정
- Java
- NextJS
- java9
- ollama langflow
- swagger
- Today
- Total
개발자의 길
[java] java9(자바9) 새로운 기능 - 변화와 특징 요약 본문
java용 REPL, JShell, JVM Logging 등장
https://jdk9.java.net/download/ 에서 다운로드
불변 Collection 생성 메서드 제공
기존에 guava를 사용해서 생성하던 불변 List, Set, Map, Map.Entry 생성 가능
List immutableList = List.of();
Map immutableMap = Map.of(1, "one", 2, "two"); |
Java 9 Module System
Jigsaw Project의 특징
- Modular JDK
- Modular Java Source Code
- Modular Run-time Images
- Encapsulate Java Internal APIs
- Java Platform Module System
Jigsaw가 주는 이점
- 편하고 효율적인 Java 개발 환경을 만들기 위해서 시작
- Jar기반 모노리틱 방식을 개선하여 모듈 지정 및 모듈별 버전 관리 기능이 가능함
- 필요한 모듈만 구동하여 크기와 성능 최적화가 가능
- 임베디드와 같은 환경에서 필요한 모듈만 탑재되어 적은 메모리로 로딩이 가능함
간단한 사용법
// Java 코드 최상위에 module-info.java 파일을 만들고, 아래와 같이 사용함 module java.sql { requires public java.logging; requires public java.xml; exports java.sql; exports javax.sql; exports javax.transaction.xa; } |
자세한 사용법은 아래 링크에서 확인
http://openjdk.java.net/projects/jigsaw/quick-start
프로세스 API 개선
OS 프로세스 관리 및 컨트롤을 위해서 아래 두개의 패키지가 추가됨
java.lang.ProcessHandle java.lang.ProcessHandle.Info |
아래와 같이 사용할 수 있음
ProcessHandle self = ProcessHandle.current();
Optional<String[]> args = procInfo.arguments();
// Destroying Processes |
try-with-resources 개선
void tryWithResourcesByJava7() throws IOException { try (BufferedReader reader2 = reader1) {
// final or effectively final이 적용되어 reader 참조를 사용할 수 있음 try (reader) { |
Diamond Operator의 한계를 개선
anonymous inner 클래스에서 diamond operator를 사용할 수 있음
FooClass<Integer> fc = new FooClass<>(1) {
FooClass<? extends Integer> fc0 = new FooClass<>(1) {
FooClass<?> fc1 = new FooClass<>(1) {
// 타입 파라메터없이 List만 사용해도 추론이 가능함 |
Interface Private Method
인터페이스 내에서 private 메서드 사용이 가능해짐
interface NewInterface {
private String instancePrivate() {
default void check() { |
CompletableFuthre API 개선
// 50초후에 새로운 Executor 생성 |
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 |
@FunctionalInterface public static interface Publisher<T> { public void subscribe(Subscriber<?superT> subscriber); } public static interface Subscriber<T> { public void onSubscribe(Subscription subscription); public void onNext(Titem); public void onError(Throwable throwable); public void onComplete(); } public static interface Subscription { public void request(long n); public void cancel(); } public static interface Processor<T,R> extends Subscriber<T>, Publisher<R> { } |
설명은 간단하지만, 필자 생각에는 Java 9의 가장 큰 변화중 하나임.
Optional To Stream
Stream<Optional> person = getPerson(id);
// 아래와 같이 Optional로 Stream을 생성할 수 있음. |
Stream API 개선
// iterate에 아래와 같이 Predicate을 받을 수 있는 인터페이스 추가
// 아래 Stream 인터페이스 추가 |
HTTP2 클라이언트
- HttpURLConnection를 대체함
- “jdk.incubator.http” 패키지 추가됨
- HTTP/1.1 및 HTTP/2 프로토콜 지원
- 동기/비동기 모드 지원
- Apache HttpClient, Netty, Jetty와 비교할 수 있는 성능
// 동기 호출
int responseCode = response.responseCode();
// 비동기 호출
CompletableFuture<HttpResponse> future = request.sendAsync();
HttpResponse response = future.get(); |
Multi-Resolution Image API
- java.awt.image.MultiResolutionImage 인터페이스 추가
- 해상도가 다른 이미지들을 하나의 객체로 캡슐화할 수 있음
- 요구사항을 통해서 이미지 쿼리 가능
Multi-release JARs
특정 버전에서만 원하는 클래스가 동작하도록 할 수 있음
multirelease.jar ├── META-INF │ └── versions │ └── 9 │ └── multirelease │ └── Helper.class ├── multirelease ├── Helper.class └── Main.class |
여기서 multirelease.jar는 Java 9에서만 META-INF / versions / 9에 있는 Helper.class가 동작되도록 할 수 있다. 이렇게하면 이 Helper.class내에서는 Java 9의 기능을 온전히 활용할 수 있다. 동시에 이전 Java 버전에서 이 JAR를 사용해도 최상위 Helper.class가 사용되기 때문에 Java 버전에 관계없이 동일한 JAR로 호환이 가능하다.
기타 변경 및 개선 사항
- GC 개선
- Stack-Walking API
- Filter Incoming Serialization Data
- Deprecate the Applet API
- Indify String Concatenation
- Enhanced Method Handles
- Java Platform Logging API and Service
- Compact Strings
- Parser API for Nashorn
- Javadoc에 검색 기능 추가
- HTML5 Javadoc
'4. JAVA' 카테고리의 다른 글
[java] Optional 사용법 및 제대로 쓰기 (0) | 2020.03.20 |
---|---|
[java] spring Interceptor 에서 DB(mybatis) connection 연동 하기 (0) | 2019.11.15 |
JVM의 default heap size 확인(리눅스, 윈도우) (1) | 2019.10.02 |
springboot - apache - tomcat 연동(springboot 내장톰캣) (0) | 2019.04.30 |
spring security 파헤치기 (구조, 인증과정, 설정, 핸들러 및 암호화 예제, @Secured, @AuthenticationPrincipal, taglib) (0) | 2019.04.10 |
이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.