자바8 과 자바17에는 큰 차이가 있다고 얼핏 들어왔다. 이번에는 확실히 정리해 차이를 알고자 한다.
먼저 Java 뒤에 붙는 영어부터 알아보자.
일반적인 개발에서는 SE만 신경쓰면 될 것 같다!
Long Term Support는 출시 후 8년이라는 긴 기간을 보안 업데이트와 버그 수정을 지원하는 버전이다.
Oracle 인수 후 java8에서 등장한 lambda와 Stream등 편리한 기능으로
java 8에 대한 지원을 2030년 까지로 확장하기로 했다.
❗ 따라서 왜 해당 버전을 사용하는 지 알기 위해서는 LTS인 8, 11, 17의 차이를 알면 될 것 같다.
Lambda
함수를 하나의 식으로 표현한 것이다. Java 8 이전 익명 클래스의 사용을 더욱 간결하게 바꾼 것이다.
List<Integer> intList = new ArrayList<Integer>();
intList.add(0);
intList.add(1);
intList.add(2);
/// 인스턴스의 메소드
List<Integer> resultList = intList.stream().map(intList::get).collect(Collectors.toList());
/// 클래스의 생성자
List<Double> resultList = intList.stream().map(Double::new).collect(Collectors.toList());
System.out.println(intList);
System.out.println(resultList);
--------------------------------------------------------------------------------------
람다와 메소드 레퍼런스로 단축 표현
(String s) -> System.out.println(s) : System.out::println
(str, i) -> str.substring(i) : String::substring
Stream
순차/병렬 작업을 지원한다. 하나의 문장으로 다양한 처리 기능을 구현이 가능하다.
Interface의 Default Methods
인터페이스는 메소드 정의만 할 수 있고 구현은 할 수 없었지만, 디폴트 메소드라는 개념이 생겨 구현 내용도 인터페이스에 포함시킬 수 있다. 호환성 때문에 사용한다고 하는데 더 알아봐야 할 것 같다.
public interface Calculator {
public int plus(int i, int j);
public int multiple(int i, int j);
default int exec(int i, int j){ //default로 선언함으로 메소드를 구현할 수 있다.
return i + j;
}
}
//상속받은 클래스에서 구현
public class MyCalculator implements Calculator {
@Override
public int plus(int i, int j) {
return i + j;
}
}
//상속받은 클래스에서 따로 구현 X
public class MyCalculatorExam {
public static void main(String[] args) {
Calculator cal = new MyCalculator();
int value = cal.exec(5,10);
System.out.println(value);
}
}
Optional
Optional 구조체로 인해 간편하게 NPE(Null Pointer Exception) 이슈에 대응할 수 있다.
try catch문을 줄일 수 있다. Optional도 사용법을 정리할 예정이다.
LocalDateTime
기존 Date와 Calendar 클래스의 기능 부족과 비 표준 명명 규칙을 해결하기 위해 나온 API이다.
자바 11의 경우 개발자의 관점에서는 큰 차이는 없다.
string의 공백 관련 메소드가 추가된 것과 람다 표현식에 var사용 가능한 것을 제외하고는 8과 큰 차이가 없는 것처럼 느껴졌다.
Pattern Matching fot switch
코드 가독성 향상과 불필요한 캐스팅, 조건문을 줄일 수 있게 되었다.
static void typeTester(Object o) {
switch(o) {
case null -> System.out.println("null");
case String s -> System.out.println("String");
}
}
이외에도 enum형이나 다른 자료형도 받을 수 있다.
Sealed Classes
상속하거나 구현할 클래스를 지정해두고, 해당 클래스들만 상속/구현이 가능하도록 제한하는 기능이다. 이를 통해 어떤 클래스가 해당 클래스를 상속받는지를 쉽게 알 수 있고 제한할 수 있다.
게임 예시를 들면 Character라는 class에서 주인공과 몬스터를 두고
주인공인 Hero클래스에서 permit을 젤다 클래스에만 주는 것이다. 그러면 Monster클래스는 절대 상속을 할 수 없다.
참고
https://velog.io/@ililil9482/Java17%EC%9D%84-%EA%B3%A0%EB%A0%A4%ED%95%B4%EC%95%BC%ED%95%A0%EA%B9%8C
공감하며 읽었습니다. 좋은 글 감사드립니다.