Java8에서의 변경된 내역들을 정리해 보도록 하겠습니다
- PermGen 영역의 제거 ( to meta space )
- Lambda Expression
- Stream API
- Interface ( default, static method )
- Optional
- java.time 패키지
- 나즈혼( javascript engine )
PermGen 영역의 제거
Permanent Generation
- Class의 Meta정보나 Method의 Meta정보, Static변수와 상수 정보들이 저장되는 공간, 흔히 메타데이터 저장 영역
위와 같은 Exception은 Heap의 구성 중, Permanent Generation의 memory가 부족한 현상입니다
PermGen 영역은 GC가 되지 않으며 클래스 메타 데이터를 저장하는 용도로 사용되었습니다
점점 자바 프로젝트에 사용되는 프레임워크와 라이브러리의 수와 규모가 커지기도 하고
최근엔 동적 클래스 생성 기법도 광범위하게 사용되어 PermGen이 부족해 오류가 발생하는 일이 빈번해졌습니다.
Java8 버전에서부터는 Permanent Generation이 존재하지 않는다 -> 해당 영역을 MetaSpace로 대체
- Static Object 및 상수화된 String Object를 heap 영역으로 옮김으로써, 최대한 GC가 될 수 있도록 수정
- Metaspace 영역은 Heap이 아닌 Native 메모리 영역으로 취급
Lambda Expression
람다 표현식(Lambda Expression)이란 간단히 말해 메서드를 하나의 식으로 표현한 것입니다
메서드의 이름과 반환값이 없어지므로 익명 함수(Anonymous Function)라고도 부릅니다
직접 간단한 예시를 보면 이해하기 쉽다
// ~ java7
Collections.sort(listMyClass, new Comparator<MyClass>() {
public int compare(MyClass a, MyClass b) {
return b.getValue() - a.getValue();
}
});
// lamda expression - java8 ~
listMyClass.sort((MyClass a, MyClass b) -> {
return a.getValue() - b.getValue();
});
Stream API
Stream Interface는 컬랙션(Collection)을 다루는 새로운 방법을 제공
Collection, Array, I/O 리소스 등 저장된 데이터에 대해서 filtering, matching, mapping등과 같은 복잡한 데이터 처리 작업을 수행하는 데 사용됩니다.
// 정수형 배열에서 스트림 생성
Integer[] arr = new Integer[] {1, 5, 11, 13, 20, 52};
Stream stream;
stream = Arrays.stream(arr)
.filter(i -> i % 2 != 0) // {1, 5, 11, 13}
.map(i -> i * 2); // {2, 10, 22, 26}
Interface ( default, static method )
Java8 버전 이전에는 interface는 public abstract methods만 허용했습니다
하지만 Java8부터는 interface에서 static과 default 메서드를 사용할 수 있습니다.
public interface Vehicle {
void run();
static String staticProducer() {
return "static Vehicles ! ";
}
default String defaultProducer() {
return "default Vehicles ! ";
}
}
Vehicle vehicle = new VehicleImpl();
String stProducer = vehicle.staticProducer();
String deProducer = vehicle.defaultProducer();
Optional
Optional 객체를 사용하면 예상치 못한 NullPointerException 예외를 제공되는 메서드로 간단히 회피할 수 있습니다.
즉, 복잡한 조건문 없이도 널(null) 값으로 인해 발생하는 예외를 처리할 수 있게 됩니다.
java.time 패키지
Java에서는 Date 표현에 해당하는 다양한 Class들을 제공한다.
대표적으로는 java.util.Date Class와 java.time.LocalDateTime Class가 있다
나즈혼( javascript engine )
지금까지 자바스크립트의 기본 엔진으로는 모질라의 라이노 (Rhino)가 사용
Java SE 8 버전부터는 자바스크립트의 새로운 엔진으로 오라클의 나즈혼 (Nashorn)을 도입
( 성능과 메모리 관리 측면에서 크게 개선된 스크립트 엔진 )