JAVA8 특징

Heap Permanent Generation 제거

JVM 힙메모리에서 Permanent 영역이 삭제되었다. Permanent Generation은 Class 혹은 Method Code가 저장되는 영역이다. Java8 이전에는 PermSize, MaxPermSize를 설정해주어야 했으나 제거되고 Metaspace로 대체되었다. Meataspace는 런타임시 메모리 요구사항에 따라 자동으로 크기가 조절되며 MaxMetaspaceSize 옵션으로 Metaspace의 양을 조절할 수 있다. Metaspace는 Java의 클래스로더가 현재까지 로드한 Class들의 메타데이터가 저장되는 공간이다. JVM의 힙메모리 영역이 아니라 OS레벨에서 관리되는 Native 메모리 영역에 위치한다.

Interface Default and Static Methods

인터페이스 디폴트 메소드 와 스테틱 메소드를 선언할 수 있게 되었다.

public interface Master {
    default String name() {
        return "master";
    }
    
    static String sub(int num) {
        return num - 1;
    }
}

스테틱 메소드는 구현체에서 재정의 할 수 없다.

Functional Interface

하나의 추상메소드를 제공하는 인터페이스가 추가되었다. 추상메소드외에 디폴트 메소드나 정적 메소드는 원하는 만큼 사용할 수 있다. @FunctionalInterface와 함께 쓰인다. 추상 메소드가 여러개라면 컴파일 타임에 잡아낼 수가 있다. 주된 인터페이스는 Consumer, Function, Supplier등이 있다.

Lamda 표현식

메소드를 하나의 식으로 표현한 것을 말한다. 람다식은 함수의 이름이 없기 때문에 익명 함수라고 불리며, 메소드의 매개 변수로 전달되던가 메소드의 결과로 반환될 수 있는 특징이 있어 함수를 변수로 다룰 수 있다. 람다는 메소드를 가진 객체를 생성한다고 보면 된다. 주로 함수영 인터페이스의 익명 객체를 대체하기 위해 람다식을 사용하며 간결하고 부수 효과가 없는 코드를 만들어 낼 수 있다.

// AS-IS
for(Info info : infoList) {
    System.out.println(info);
}

// TO-BE
infoList(info -> System.out.println(info));