1. Java 11의 특징
특징
- lambda 파라미터에 지역변수(var) 표현가능
- Epsilon Garbege Collector : 할당을 처리하지만 메모리를 회수하지는 않습니다
메모리를 다 사용하면 OutOfMemory가 발생하고 JVM은 셧다운된다.
수명이 짧은 서비스와 가비지를 사용하지 않는 것으로 알려진 애플리케이션에 유용
- 모듈 : 모듈을 통해 애플리케이션에 필요한 구성 요소만 포함하는 런타임 구성을 사용자 지정가능
메모리 공간을 더 적게 사용 -> 특히 마이크로서비스 아키텍처에서 유용
모듈이 내보내는 패키지와 필요한 구성 요소를 명시적으로 선언하고 반사적 액세스를 제한
-> 강력한 캡슐화를 적용
- HTTP Client : Java 표준 HTTP 클라이언트 API.
HTTP 통신을 위해 사용된 코드보다 성능이 개선됨
HTTP/1.1, HTTP/2, WebSocket을 지원
- JVM과 핵심 라이브러리 성능 향상
- 프로파일링 진단 : Java Flight Recoder
-> 실행 중인 Java 애플리케이션에서 진단 및 프로파일링 데이터를 수집
Java Mission Control
-> JFR 및 JMC를 사용하면 메모리 누수, GC 오버헤드, 핫 메서드, 스레드 병목 상태 및 I/O 블로킹과 같은 런타임 문제를 진단
통합 로깅
-> 세분화된 로깅은 JVM 충돌에 대한 근본 원인 분석을 수행하고 프로덕션 환경에서 성능 문제를 진단하는 데 유용
오버헤드가 낮은 힙 프로파일링
- 새로운 String 메소드 추가
strip(): 문자열 앞, 뒤의 공백 제거.
stripLeading(): 문자열 앞의 공백 제거.
stripTrailing(): 문자열 뒤의 공백 제거.
=> Java 8과 Java 11은 현재 Java LTS버전이며, Java 8에 비해 Java 11이 위와 같은 특징 및 장점을 가지고 있으므로 사용이 지향된다.
2. Java 8의 특징
Java 1.5의 제네릭 추가에 이어 가장 큰 변화가 일어난 업데이트이다.
그리고 가장 큰 변화와 특징은 람다와 스트림이다.
- lambda : 람다는 함수형 프로그래밍에서 사용되는 개념으로 '익명 함수'를 말한다.
메소드를 하나의 식(expression)으로 표현하는 것으로, 메소드의 이름과 반환값이 없어서 '익명 함수'라고도 한다.
람다식은 메소드의 매개변수로 전달될 수 있고, 메소드의 결과로 반환될 수 있다.
또한, 매개변수 타입은 추론이 가능한 경우 생략할 수 있다.
특징
- 익명 : 보통의 메소드와는 달리 이름이 없다.
- 함수 : 메소드처럼 특정 클래스에 종속되지 않으므로 함수이다.
- 전달 : 람다식을 메소드의 파라미터로 전달하거나 변수로 저장할 수 있다.
- 간결성 : 익명 클래스처럼 필요없는 코드로 구현할 필요가 없다.
목적 : 함수형 프로그래밍 패러다임으로 전환하기 위한 하나듸 '단계'이다.
이를 통해, 불필요한 코드를 줄이고 가독성을 향상시킬 수 있다.
표현 : (파라미터) -> {몸체}
- 파라미터와 몸체로 구분
- 파라미터와 몸체 사이에 ->를 추가하여 식을 완성
- 몸체 부분이 단일문인 경우 중괄호와 return문 생략 가능
한계
- 함수형으로 새롭게 정의한 것이 아니라, 기존의 인터페이스 형태를 축약형으로 표현.
- 완전히 함수형 패러다임으로 적용할 수 없음
- 오직 함수형 인터페이스를 기대하는 곳에서만 사용 가능
- Stream : 함수형 인터페이스를 통한 간단한 내부 데이터 순회 방법이다.
데이터를 추상화해서 다루고, 다양한 형태로 저장된 데이터를 위한 공통된 방법을 제공한다.
즉, 컬렉션이나 배열같은 저장 요소를 하나씩 참조하여 람다식을 적용하고 반복적으로 처리할 수 있도록 하는 기능이다.
특징
- 내부 반복을 통해 작업을 수행
- 재사용이 불가 -> 단 한번만 사용가능
- 원본데이터를 변경하지 않음
- filter-map기반의 API를 사용하며, Lazy연산을 통해 성능을 최적화
- parallelStream() 메소드를 통해 간단한 병렬처리 지원
목적 : 불필요한 코드(for문, if문 등)을 줄이고 직관적으로 표현하여 가독성을 높인다.
구조 : 스트림생성().중개연산().최종연산();
+ Java 버전별 특징 정리
JDK 1.1 - inner class
- Java Beans
- RMI
- reflection
- unicode
- internationalization
J2SE 1.2 - strictfp
- SWING GUI
- JIT CORBA
- Collections
J2SE 1.3 - HotSpot JVM
- JNDI
- JPDA
- JavaSound
J2SE 1.4 - assert
- regular expression
- NIO
- IPv6
- XML API
- JCE
- JSSE
- JASS
- Java Web Start
J2SE 5 - generics
- annotation
- auto boxint / unboxing
- enumeration
- 가변길이 파라미터
- static import
- concurency API
Java SE 6 - interface에 @Override 추가됨
- JDBC 4.0
- Scripting Language Support
- Java Compiler API
- plugable annotation
Java SE 7 - diamond operator <>
- try-resource
- multi-catch
- switch문에 String 사용
- concurency API(new)
- File NIO(new)
- Java2D 지원
- dynamic Language 지원
Java SE 8 - lambda expression
- type annotaion
- stream api 추가
- repeating annotation
- static link library
- interface default method
- unsigned integer 계산
- 날짜와 시간 API(new) -> JodaTime
- rhino 대신 nashorn javascript 엔진 탑재
Java SE 9 - Jingsaw 기반 런타임 모듈화(module)
- JShell 추가(인터프리터 쉘처럼 사용)
- private interface method
- immutable collection
- 통합 로깅
- HTTP/2
- HTML 5 JavaDoc
- 프로퍼티 파일에 UTF-8지원
Java SE 10 - var 키워드를 이용한 지역변수 타입 추론
- 병렬처리 가비지 컬렉터
- 개별 Thread로 분리된 Stop-The World
- 루트 CA
- JVM Heap 영역을 시스템 메모리가 아닌 다른 메모리에도 할당
Java SE 11 - lambda 파라미터에 지역변수 문법
- 엡실론 가비지 컬렉터
- HTTP 클라이언트 표준화
Java SE 12 - switch문 확장(->)
- 가비지 컬렉터 개선
- 마이크로 벤치마크 툴 추가
- 성능 개선
Java SE 13 - switch문에 yield 예약어 추가
'Programming Language > JAVA' 카테고리의 다른 글
JVM (Java Virtual Machine ) 이란? (0) | 2022.01.17 |
---|---|
문자열을 숫자로 (Integer) parseInt(String) VS valueOf(String) (0) | 2022.01.17 |