자바 버전에는 여러가지 버전이 있지만, 그 중 많이 쓰이는 버전은 8,11,17 이다.
JAVA 8 이상 이라는 문구를 많이 보았을 것이다.
이러한 이유는, 해당 버전들이 LTS 이기 때문이다.
Long Term Support는 출시 후 8년이라는 긴 기간을 보안 업데이트와 버그 수정을 지원하는 버전이라는 뜻이다.
Java 8 (was released on March 18, 2014)
Lamda
int max(int a, int b) {
return a > b ? a : b;
}
//람다식으로 변환
(a, b) -> a > b ? a : b;
'람다식(Lambda Expression)'이란 함수를 간단한 식으로 표현하는 방법을 말한다.
메서드의 이름과 반환값(return)이 생략된다는 점에서 '익명 함수(anonymous function)'라고도 불린다.
Stream API
List<String> lowercase = Arrays.asList("a", "b", "c", "d", "e");
lowercase.stream()
.map(String::toUpperCase)
.forEach(System.out::println);
Steam은 컬렉션의 저장 요소를 하나씩 순회하면서 처리할 수 있는 코드 패턴.
람다식을 지원한다는 점과 내부 반복자를 사용하기 때문에 병렬 처리가 쉽다는 특징이 있다.
interface default method
public interface TestInterface {
void doSomething();
default void doSomethingDefault() {
System.out.println("doing something default");
}
}
//implements the interface
public class TestClass implements TestInterface {
@Override
public void doSomething() {
System.out.println("doing something");
}
}
TestClass testClass = new TestClass();
testClass.doSomething(); // Output: "doing something"
testClass.doSomethingDefault(); // Output: "doing something default"
java 8 이전의 인터페이스는 메서드 정의만 할 수 있었고 구현은 할 수 없었다.
8 버전부터 default method라는 개념이 생기면서 구현 내용도 인터페이스에 포함시킬 수 있게 되었다.
Optional class
//create an optional that contains a value
Optional<String> optional = Optional.of("Hello, world!");
//check if a value is present
if (optional.isPresent()) {
String value = optional.get();
System.out.println(value); // Output: "Hello, world!"
}
//create an empty optional
Optional<String> emptyOptional = Optional.empty();
//get a default value if the optional is empty
String value = emptyOptional.orElse("default value");
System.out.println(value); // Output: "default value"
//throw exception
emptyOptional.orElseThrow(() -> new RuntimeException("throw Exception"));
Optional는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 참조하더라도 NPE(Null Pointer Exception)가 발생하지 않도록 도와주는 역할을 한다.
따라서 예상치 못한 Null Pointer Exception이 발생될만한 상황에서도 예시와 같이 제공되는 메서드를 통해 간단하게 예외 처리를 할 수 있다.
Seald class
public sealed class Shape permits Circle, Square {
// common fields and methods
}
public final class Circle extends Shape {
// circle-specific fields and methods
}
public final class Square extends Shape {
// square-specific fields and methods
}
17 버전에서 추가된 Seald Class, Interface는 상속하거나(extends), 구현(implements) 할 클래스를 지정해 두고, 해당 클래스들만 상속 또는 구현을 허용하는 키워드이다.
개발자는 seald 키워드를 통해 어떤 클래스가 해당 클래스를 상속 또는 구현하는지를 쉽게 알 수 있고, 또 제한할 수 있다.
'그래서 무슨 버전을 쓰는 것이 좋은가?'라고 한다면, 단순히 사용할 버전만 생각하는 것이 아니라 개발 환경과 여러 요소들이 모두 고려되어야 하는 문제이기 때문에 정답은 없다고 생각된다.
하지만 스프링 부트 3.0에서 java 17 이상을 사용해야 한다는 점과 java 8의 사용 비율이 줄어들고 있는 추세를 봤을 때, 11 버전 또는 17 버전을 사용하는 것에 큰 문제가 없다면 신규 프로젝트에서는 11 이상의 버전을 도입해 보는 것도 좋을 것 같다.