Java 8 이전에는 초기 설정할 때, PermSize와 MaxPermSize를 설정해 주어야 했으나, Java 8부터는 Permanent Generation이 Metaspace로 대체되었다. Metaspace는 런타임 시 메모리 요구 사항에 따라 자체 크기를 조정하며, 필요하다면 MaxMetaspaceSize
매개 변수를 설정하여 Metaspace의 양을 조절할 수 있다.
Permanent Generation
Metaspace
Java 8부터는 PermGen 영역이 제거되고 대신 Metaspace가 대체되어 위와 같은 구조를 띈다
public class User {
private String name;
public User(String name) {
this.name = name;
}
public static boolean isRealUser(User user) {
...
}
}
lambda식에서 사용하는 메서드 참조는 더 짧고 가독성 있게 사용할 수 있도록 되었습니다. static 메서드라고 하면 ContainingClass::methodName
의 형식으로 사용할 수 있습니다.
CASE1
List<User> list = Arrays.asList(new User("Kim"), new User("Yeom"))
list.stream.anyMatch(u -> User.isRealUser(u));
위의 뜻은 list에서 한개의 요소를 탐색해가며 isRealUser라는 메서드가 만족하는지 보는 것입니다. 이러한 식은 아래와 같이 변경할 수 있습니다.
list.stream.anyMatch(User::isRealUser);
static 메서드가 아니라도 가능, isRealName 메서드가 User class의 메서드가 되었다고 했을 때도 가능
User user = new User("kim");
list.stream().anyMatch(user::isRealName);
ClassName::new의 형식으로 생성자를 나타낼 수 있다
List<String> list = Arrays.asList("Kim", "Yeom");
list.stream.map(User::new);
java8 이전에는 public, abstract methods만 허용했으나 java8부터는 static과 default 메서드 사용 가능
public interface Vehicle {
void run();
static String producer() {
return "Hyundai";
}
}
//
String producer = Vehicle.producer();
default로 선언된 메서드는 그냥 사용할 수도 있으며 override하여 사용할 수도 있음
public interface Vehicle {
void run();
default String producer() {
return "Hyudai";
}
}
//
Vehicle vehicle = new VehicleImpl();
String producer = vehicle.producer();
interface에 static과 default method가 추가 됨으로써 기존의 abstract class에서 interface를 구현해서 default method를 만들어내는 방법을 사용하지 않아도 된다.
NullPointerException의 발생 가능성에 대한 코드에 대해 도와준다
List<String> list = getList();
List<String> listOpt = list != null ? list : new ArrayList<>();
// ->
List<String> listOpt = getList().orElseGet(() -> new ArrayList<>());
User user = getUser();
if(user != null) {
Address address = user.getAddress();
if(address != null)
String street = address.getStreet();
if(street != null) return street;
}
}
return "not spec";
Optional<User> user = Optional.ofNullable(getUser());
String result = user
.map(User::getAddress)
.map(Address::getStreet)
.orElse("not spec");