[JAVA] LTS 버전 별 특징

용용학생·2024년 8월 13일

자바

목록 보기
25/32
post-thumbnail

기본적으로 자바는 JAVA 9 이후부터 6개월에 한 번씩 3월과 9월에 새로운 릴리즈 버전을 내고 있다.

이 글을 작성하고 있는 2024.08.10 기준 JAVA SE 23 프리뷰까지 공개되었으며 9월에 최종 릴리즈가 나올 예정이다.
이 정보는 Oracle 자바 SE 로드맵을 통해 확인할 수 있다.

이번 글에서는 주요 변화가 있는 자바 버전의 기능을 간략하게 정리해본다.

자바 버전에는 non-LTS와 LTS 버전이 있다.
LTS 버전은 장기간동안 안정적인 보안 패치와 성능 개선 같은 지원을 받을 수 있다. 그렇기에 LTS 버전을 사용하는 게 일반적이다.

JAVA 5

Generics

  • 컴파일 시간에 강한 타입체크를 통해 작성 중 타입캐스팅 문제를 방지
// Before
public class Box {
    private Object object;
    public void set(Object object) { this.object = object; }
    public Object get() { return object; }
}

// After
public class Box<T> {
    private T value;
    public void set(T value) { this.value = value; }
    public T get() { return value; }
}

Enumeration

  • 한정된 값만을 가지게 하는 데이터 타입
enum Color {
    RED("빨강"),
    BLUE("파랑"),
    BLACK("검정")
    
    private String name;
    
    Color(String name) { this.name = name; }
}

JAVA 8 (LTS)

JAVA 8의 핵심은 함수형 프로그래밍 패러다임의 접목이다.

Lambda

  • 익명 함수를 단순화시키는 식
// Before
Comparator<Apple> weight = new Comparator<Apple>() {
    public int compare(Apple a1, Apple a2) {
        return a1.getWeight().compareTo(a2.getWeight());
    }
}

// After
Comparator<Apple> weight = (Apple a1, Apple a2) 
    -> a1.getWeight().compareTo(a2.getWeight());

메서드 참조

  • 람다 표현식을 더 간결하게 표현하기 위한 기능
// Before
Fuction<String, Integer> stringToInt;
stringToInt = (s) -> Integer.parseInt(s);
stringToInt.apply("100");

// After
Function<String, Integer> stringToInt;
stringToInt = Integer::parseInt;
stringToInt.apply("100");

Functional Interface

  • 추상메서드가 오직 하나만 있는 인터페이스
  • 람다식은 이 함수형 인터페이스로만 사용이 가능
  • 자바 API의 함수형 인터페이스에는 Comparator, Runnable이 있고 java.util.function에 있는 기본으로 제공되는 인터페이스들도 있다.

default method

  • 인터페이스에 구현부를 제공하는 디폴트 메서드
  • 구현 클래스들의 수정 필요 없이 인터페이스에 새로운 메서드를 추가할 수 있음
public interface MyInterface {

    // regular interface methods
    
    default void defaultMethod() {
        // default method implementation
    }
}

Stream

  • 일련의 데이터를 선언형으로 쉽게 가공하고 처리하게 하는 기능
int sum = widgets.stream()
                 .filter(w -> w.getColor() == RED)
                 .mapToInt(w -> w.getWeight())
                 .sum();

Optional

  • 값이 비어있음을 명시할 수 있고, Null 값을 다루는 방식을 개선하기 위해 도입
  • NullPointerException을 방지하기 하기 쉬워짐
Optional<String> notEmpty = Optional.of("Not Empty");
notEmpty.ifPresent(() -> System.out.println("It's Present");
| It's Present

Optional<String> empty = Optional.empty();
String orElseEmpty = empty.orElse("Default Value");
System.out.println(orElseEmpty);
| Default Value

새로운 날짜, 시간 API 도입

  • 기존 Date와 Calendar 클래스의 기능 부족과 비 표준적인 명명 규칙, 일관되지 않은 속성 값의 문제를 해결하기 위해 도입
  • java.time 패키지에 포함된 클래스들

JAVA 10

var 키워드

  • 로컬 변수의 타입 추론에 사용되는 var 키워드가 도입
var name = "Hong";
var age = 20;

JAVA 11 (LTS)

HTTP Client API

  • 표준 HTTP 클라이언트 API가 도입되어 HTTP 요청을 더 쉽게 가능케하고 성능이 개선

String API 개선

  • strip(), stripLeading(), stripTrailing(), isBlank(), repeat(n) 메서드가 추가

File API 개선

  • java.nio.file.Files 클래스에 새로운 메서드가 추가됨
  • writeString(), readString(), isSameFile() 메서드 추가

Collection에 toArray() 메서드 추가

람다에 var 사용 가능

  • 기존에는 초기값이 있는 지역변수에만 사용 가능했지만, 람다식에서 var을 사용할 수 있게 됨

Oracle JDK와 OpenJDK의 통합, Oracle JDK가 유료모델로의 전환

JAVA 17 (LTS)

  • 데이터 지향 프로그래밍
  • Spring Boot 3.X 가 17이 강제
  • Immutable Collections 의 지원 (toList())
  • Pattern Matching

Records 추가

  • 불변 데이터 객체를 쉽게 생성하게 하는 Record 클래스가 추가
  • 더 간단한 형식으로 불변 데이터를 작성할 수 있게 됨
// Before
class Point {
    private final int x;
    private final int y;
    
    Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
    
    int x() { return x; }
    int y() { return y; }
    
    public boolean equals(Object o) {
        if (!(o instanceof Point)) return false;
        Point other = (Point)o;
        return other.x == x && other.y == y;
    }
    
    public int hashCode() {
        return Objects.hash(x, y);
    }
    
    public String toString() {
        return String.format("Point[x=%d, y=%d]", x, y);
    }
}

// After
record Point(int x, int y) { }

Sealed Class

  • 허용된 클래스만이 상속을 하게 하여 무분별한 상속을 방지
  • 제약 조건 : 무조건 같은 패키지에서 존재해야 함
sealed class Shape permits Circle, Rectangle, Square { ... }

public final class Circle extends Shape { ... }

public sealed class Rectangle extends Shape
    permits TransparentRectangle { ... }
    
public non-sealed class Square extends Shape { ... }

JAVA 21 (LTS)

가상 스레드

  • 자바 플랫폼에 경량 가상 스레드를 도입하여 몇 개의 OS 스레드만으로 수백만 개의 가상 스레드 실행이 가능해짐

Sequenced Collections

profile
자바 스프링 공부하는 정리 블로그!

1개의 댓글