JAVA 8 특징

Better late than never·2023년 9월 11일
0

Heap Permanent Generation

Java 8 이전에는 초기 설정할 때, PermSize와 MaxPermSize를 설정해 주어야 했으나, Java 8부터는 Permanent Generation이 Metaspace로 대체되었다. Metaspace는 런타임 시 메모리 요구 사항에 따라 자체 크기를 조정하며, 필요하다면 MaxMetaspaceSize 매개 변수를 설정하여 Metaspace의 양을 조절할 수 있다.

Permanent Generation

  • Permanet Generation은 Class 혹은 Method Code가 저장되는 영역이다.
  • PermGen은 Heap 영역에 속한다.
  • Default로 제한된 크기를 갖고 있다.

Metaspace

  • Metaspace는 Java의 클래스 로더가 현재까지 로드한 Class들의 메타데이터가 저장되는 공간이다.
  • JVM에 의해 관리되는 Heap 영역이 아니라 OS 레벨에서 관리되는 Native 메모리 영역에 위치한다.
    • 따라서 개발자는 영역 확보의 상한을 크게 의식할 필요가 없다. 단지 PermGen이 빠진 Heap 영역만 잘 관리하면 된다.
  • Default로 제한된 크기를 가지고 있지 않고, 필요한 만큼 늘어난다.

Java 8부터는 PermGen 영역이 제거되고 대신 Metaspace가 대체되어 위와 같은 구조를 띈다

static ::

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);

instance type

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);

Interface

java8 이전에는 public, abstract methods만 허용했으나 java8부터는 static과 default 메서드 사용 가능

static method

public interface Vehicle {
	void run();
	static String producer() {
		return "Hyundai";
	}
}

//

String producer = Vehicle.producer();

Default Method

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를 만들어내는 방법을 사용하지 않아도 된다.

Optional

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";
  • user null check → address check → street check
Optional<User> user = Optional.ofNullable(getUser());
String result = user
	.map(User::getAddress)
	.map(Address::getStreet)
	.orElse("not spec");

0개의 댓글