본문 바로가기

Dev/JAVA

JAVA 8, 9, 10

java 8
JDK 2개 버전
1. 폐쇄적인 상업 코드 기반의 Oracle JDK
2. 오픈 소스 기반의 OpenJDK
Lambda 및 함수형 프로그래밍, Default Method Interface, 메소드 참조

Lambda 함수형 프로그래밍
널리 쓰이는 언어 중 함수형으로 분류되는 언어 - JavaScript

함수 = ‘1급 시민’
- 변수에 저장할 수 있으며
- 함수의 리턴값일 수 있고
- 다른 함수에 파라미터로 전달할 수 있다.
함수형 인터페이스를 이용하면 메서드, 즉 함수를 객체로서 다룰 수 있다.

클로저
자바스크립트에서는 외부 함수와 내부 함수가 있을 때, 내부 함수가 더 오래 유지되는 경우 내부 함수가 외부 함수의 지역변수에 접근할 수 있다.
그 이유는 함수가 접근 가능한 변수의 scope가 “함수의 호출 시점”이 아니라 “함수의 선언 시점”에 따라 결정되기 때문.
함수형 프로그래밍에서 함수는, <자신이 선언된 시점에서의 환경 (어휘적 환경: lexical environment)> 을 기억하는 특징이 있다.
이러한 것을 클로저 라고 한다.

함수형 인터페이스 - 1개의 추상 메서드만 가지는 인터페이스
인터페이스는 기본적으로 어떤 기능이 있는지만 정의하며, 그 기능의 구현(메서드의 body)는 정하지 않는다.
이렇게 정의만 해놓고 body 를 작성하지 않은 메서드를 추상 메서드라고 한며, 추상 메서드의 구현은 이 인터페이스를 구현하는 클래스의 역할이다.
@FunctionalInterface - 이 인터페이스가 함수형 인터페이스임을 알린다

compare() - 인터페이스 안에 선언한 메서드, body 가 없으므로 이것은 추상 메서드 입니다.
equals() - 자바에서 모든 객체의 최상위에 존재하는 (명시적으로 extends하지 않더라도) Object 클래스에 정의 되어 있는 그것으로, …

스트림(Stream)
- Array나 Collection 같은 데이터를 연속적으로 가공해서 처리할 수 있게 도와주는 클래스이다.
- Stream을 사용할 수 있게 해주는 관련 메서드들을 Stream API라 하며, Stream API를 사용하기 위해서는 3가지 종류가 있다.
1. 시작 연산
Stream 객체가 아닌 다른 source로부터 Stream 객체를 얻는 연산
2. 중간연산
Stream을 가공하기 위한 연산으로, 중요한 특징 2개가 있다.
i. Stream을 리턴하므로, 중간연산 바로 다음에 다른 중간연산이나 최종연산을 이어붙일 수 있다 (chaining).
ii. 대부분 함수형 인터페이스를 인자로 받는다. 그래서 람다식을 이용할 수 있다.
3. 최종연산
스트림 연산을 끝내고 최종 결과를 얻어내는 연산으로 Stream 객체가 아닌 다른 타입을 리턴한다.

JEP에 의해서 새로운 기능들이 발의되기 시작
API: Nashorn (JS엔진), new Date and Time API, Stream API, Collection에 대한 함수형화 (Interface에 default로 인해 가능)

Java 9
Java용 REPL, Shell 등장 (대화식 REPL(Read Eval print Loop) 도구 제공)

Modular System (Jigsaw)지원
Modules - 모듈은 하나 이상의 패키지를 갖는다.

모듈 장점 3개

1. 군더더기를 제거함으로써 어플리케이션이 알맞은 덩치를 갖게 한다.
프로젝트 Jigsaw (JPMS = Java Platform Module System = JAVA Jigsaw = Project Jigsaw)
일환으로 모든 Java Platform API는 별도의 모듈들로 쪼개뎠다.
자신의 어플리케이션에서 필요한 (실제로 사용할) 모듈들만 명시할 수 있게 (가질 수 있게 ) 되었다.

2. 패키지 캡슐화를 가능하게 한다.
공개할 패키지를 명시해야하고, 명시되지 않은 패키지는 다른 모듈에서 사용할 수 없는 패키지가 된다.
-> hidden packages or encapsulated packages

3. 필요한 모듈이 있는지 없는지를 JVM start-up 타입에 검사한다.
JVM이 구동될 떄 JVM은 어플리케이션 모듈로부터 모듈 dependency graph를 확인하여 이 어플리케이션에서 어떤 모듈을 필요로 하는지 알 수 있다.
다음 필요한 모듈들이 있는지를 확인하는데 만약 필요한 모귤을 못찾으면 JVM은 missing module을 report하고 종료한다.

Module name - 모두 unique 해야한다
Module Descriptor - 이 모듈의 어떤 패키지를 export 하고 이 모듈을 위해 더떤 다른 모듈이 필요한지(requires)를 명시한다.
⚠️ 어떤 패키지를 exports 했다고 해서 그 패키지의 모든 하위 패키지까지 exports 되는 것이다.

불변 Collection (immutable collection) 제공
불변 Collection ?
아이템 추가, 수정, 제거가 불가능.
신규 아이템을 추가하거나 기존 아이템을 수엊 혹은 제거하려고 하면 java.lang.UnsupportedOperationException 발생.

Java 9는 익명 클래스에 대한 Diamond Operator 허용 (anonymous inner 클래스에서 diamond operator 사용 가능)
try-with-resources 개선
인터페이스 내 private  메소드 사용 가능
Reactive Stream API 추가
Optional To Stream
HTTP2 Client
iCMS GC Deprecated 됨

Java 10
var 키워드를 이용한 지역변수 선언 및 타입추론 가능
불변 (Unmodifiable) Collection 향상
병렬처리 가비지 컬렉션 도입으로 인한 성능 향상
개별 쓰레드로 분리된 Stop-The-World

루트 CA 목록 추가

'Dev > JAVA' 카테고리의 다른 글

Marshal & Unmarshal  (1) 2021.09.28
OOP  (2) 2021.09.28
lombok  (0) 2021.09.27
Heap & Stack  (0) 2021.09.24
extends / implements (inheritance)  (0) 2021.09.24