Java 8 변경 사항

namkun·2023년 5월 29일
0

T-I-L

목록 보기
3/20

Java 8

PermGen -> MetaSpace

  • Perm Generataion은 Java 8 이전에 Class 의 Meta 정보나 Method 의 Meta 정보, Static 변수와 상수 정보들이 저장되는 공간, 흔히 메타 데이터의 저장 영역을 말했다.
  • Perm Generation은 GC가 되지 않았기에, 자바 프로젝트에서 사용되는 프레임워크와 라이브러리가 커지거나, 수가 늘어나게 되면서 종종 해당 영역의 memory가 부족한 경우가 발생되었다.
  • Java 8 부터는 해당 영역을 MetaSpace로 대체하였다.
  • Static Object 및 상수화된 String Object를 Heap 영역으로 옮김에 따라, 최대한 GC가 될 수 있도록 수정하였다.
  • MetaSpace 영역은 Heap 이 아닌 Native Memory영역으로 취급하여 OS가 조절할 수 있도록 하였다.

lambda

  • 함수를 하나의 표현식으로 나타낸 것
  • 장점 : 코드를 간결하게 작성할 수 있다.
  • 단점 : 재활용 불가. 만약 람다가 여러 곳에서 반복되어서 사용된다면, 람다를 사용하지 않는 방법을 찾도록 하자.
// before java 8
int getMax(int a, int b){
	return a > b ? a : b;
   }
   
 // use lambda in java 8
 (int a, int b) -> {return a > b ? a : b;}
 
 // omit 'return'
 (int a, int b) -> a > b ? a : b;

Optional

  • Null 이 될 수도 있는 객체를 담는 Class
  • 명시적으로 리턴 값이 null 일 수 있음을 알려준다. 이를 이용해서 NPE를 회피할 수 있다.
  • 직접 null을 다루지 않아도 된다.
Map<Integer, String> map = new HashMap<>();
map.put(1, "hi");

// before use Optional
String text = map.get(2); // return null
int length = text == null ?  0 : text.length();  // null check

// use Optional
Optional<String> text = Optional.ofNullable(map.get(2)); // Optional
int length =  text.map(String::length).orElse(0) // null-safe

Method Reference

  • lambda의 축약 표현
  • 아래와 같이 3가지로 표현 가능
    1. Class::Instance Method (public)
    2. Class::static Method (static)
    3. Object::Instance Method (new)
  • 첫번째 형태는 첫번째 파라미터가 메서드의 수신자가 되고, 나머지 파라미터는 해당 메서드로 전달된다.
    • String::compareToIgnoreCase = (x, y) -> x.compareToIgnoreCase(y)
  • 2번은 모든 파라미터가 정적 메서드로 전달된다.
    • Object:isNull = x -> Object.isNull(x)
  • 3번은 주어진 객체에서 메서드가 호출되며, 파라미터는 인스턴스 메서드로 전달된다.
    • System.out::println = x -> System.out.println(x)

Stream

  • 배열 또는 컬렉션을 함수형으로 처리
  • 간단하게 병렬 처리가 가능하다. (Parallel Stream)
  • 내부 반복을 이용해서 작업 수행
  • 재사용 불가, 원본 데이터 변경 X
  • 연속된 요소, 중간 연산 (map, filter,,), 최종 연산 (count, foreach, sum..) 으로 나뉘어진다.

Interface Default, Statick Method

Java 8에서는 기본 구현을 포함하는 인터페이스를 정의하는 2가지 방법을 제공한다.
이로 인해서 기존에 abstract class에서 interface를 구현해서 default method를 만들어 내는 방법을 사용하지 않아도 된다.

Default Method

  • override 해서 재정의가 가능하다.
  • 참조 변수로 호출해야 한다.
public interface Car(){
	void run();
    default String beep(){
    	return "beep beep";
    }
}
Car car = new CarImpl();
System.out.println(car.beep());

static Method

  • static 메서드는 재정의가 불가하다.
  • 객체를 생성하지 않고 직접 사용하면 된다.
public interface Car(){
	void run();
    static String beep(){
    	return "beep beep";
    }
}
System.out.println(Car.beep());

Date And Time API Support

  • 불변 시간 정보를 갖고 있다.
  • LocalDate, LocalTime, LocalDateTime 클래스가 있으니 용도에 맞게 사용

Default GC

  • JAVA 8 에서 Default GC가 Parallel GC 로 변경되었다.
  • GC를 처리하는 스레드가 여러개인 Serial GC이다.

이미지 출처
perm genearation : http://karunsubramanian.com/websphere/one-important-change-in-memory-management-in-java-8/

profile
개발하는 중국학과 사람

0개의 댓글