본문 바로가기

삽질

Java 버전 별 주요 Features

1. Java 8 - LTS

1.0 종류

  • 람다 표현식
  • 함수형 인터페이스
  • 스트림 API
  • 인터페이스 default, static method
  • Optional

1.1 람다 표현식

익명 클래스 간결 표현

Runnable run = () -> System.out.print("hello ksb");

1.2 함수형 인터페이스

하나의 추상 메서드만 가지는 인터페이스

@FunctionalInterface
interface MyFunctionalInterface {
    void myMethod();
}

기본적으로 Predicate, Consumer, Supplier, Funtion, Comparator, Runnable, Callable 제공

1.3 스트림 API

간결한 코드, 쉬운 병렬 코드 작성 가능

List<Integer> numbers = Arrays.asList(1, 2, 3);
numbers.stream().forEach(System.out::println);

1.4 인터페이스 default, static 메소드

필수로 구현하지 않아도 되는 default 메소드 → 기존의 인터페이스에 새로운 기능 추가 가능

public interface Test{
  void test();
  default int testDefault(){
    return 1;
  };
}

static 하게 사용할 수 있는 static method

public interface Test{
  void test();
  static int testStatic(){
    return 1;
  }
}

1.5 Optional

주로 null 처리를 위해 사용

List<String> names = Optional.ofNullable(tmp).orElseThrow(() -> new IllegalArgumentException("잘못된 변수"))

 

2. Java 9

2.0 종류

  • 컬렉션 팩토리 method
  • Stream 기능 추가
  • Optional 기능 추가
  • 인터페이스 private method
  • 모듈 시스템

2.1 컬렉션 기능 추가

list, set, map 등에 불변 객체 생성

List<String> list = List.of("one", "two");
Set<String> set = Set.of("one", "two");
Map<String, String> map = Map.of("one key", "one value", "two key", "two value");

2.2 Stream 기능 추가

takewhile등 새로운 기능

List.of(1, 2, 3, 4).stream().takeWhile(i -> i % 2 == 0).collect(Collectors.toList());

2.4 Optional 기능 추가

stream 등 새로운 기능

Optional.of("one").stream().collect(Collectors.toList());

2.4 인터페이스 private method

인터페이스 내 코드 재활용

public interface Test {    
  void test();
  private int testPrivate(){
    return 1;
  }
}

2.5 모듈 시스템

코드의 재사용성 증가, 애플리케이션 크기 감소, 보안 강화

module com.example.myapp {
    requires java.base;
    exports com.example.myapp;
}

 

3. Java 10

3.0 종류

  • 지역 변수 타입 추론

3.1 지역 변수 타입 추론

var

var list = List.of("a", "b", "c"); // List<String>으로 추론됨
for (var item : list) {
    System.out.println(item);
}

 

4. Java 11 - LTS

4.0 종류

  • 람다 파라미터 지역 변수 추론

4.1 람다 파라미터 지역 변수 추론

람다식에서 var 사용

List<String> list = List.of("apple", "banana", "cherry");

List<String> upperCaseList = list.stream().map((var s) -> s.toUpperCase()).collect(Collectors.toList());

 

5. Java 12

5.0 종류

  • 향상된 스위치문 preview

 

6. Java 13

6.0 종류

  • Text Block preview

 

7. Java 14

7.0 종류

  • 향상된 스위치문 공식 지원
  • 향상된 NullPointerException
  • instanceof 패턴 매칭 preview
  • record 타입 preview

7.1 향상된 스위치문 표준화

switch문의 간결화

int day = 0;
String size = switch (day){
  case 1, 2, 3 -> "s";
  case 4, 5, 6 -> "m";
  case 7, 8, 9 -> "l";
  default -> "none";
};

7.2 향상된 NullPointerException

NullPointerException 발생시 예외 메시지 상세화해서 반환

 

8. Java 15

8.0 종류

  • Text Block 공식 지원
  • sealed 클래스 preview

8.1 Text Block 공식 지원

public class TextBlockExample {
  public static void main(String[] args) {
    String json = """
      {
        "name": "John",
        "age": 30,
        "city": "New York"
      }
      """;
      System.out.println(json);
  }
}

 

9. Java 16

9.0 종류

  • record 클래스 공식 지원
  • instanceof 패턴 매칭 공식 지원
  • 스트림 API toList() 추가

9.1 record 클래스 공식 지원

데이터 객체

record Point(int x, int y){}

9.2 instanceof 패턴 매칭 공식 지원

타입 변수 사용

if(obj instance of String message){
  System.out.print(message);
}

9.3 스트림 API toList() 추가

불변 객체 리스트로 변환하는 기능

List<Integer> list = Set.of(1, 2, 3).stream().toList();

 

10. Java 17 - LTS

10.0 종류

  • sealed 클래스 공식 지원

10.1 sealed 클래스 공식 지원

원치않는 상속 오류 방지

public sealed class Parent permits Son{}
public final class Son extends Parent{}

 

11. Java 18

11.0 종류

  • 향상된 switch문 새로운 기능 preview

 

12. Java 19

12.0 종류

  • 가상 쓰레드 preview
  • record 패턴 매칭 preview
  • switch 패턴 매칭 preview

 

13. Java 20

13.0 종류

  • 가상 쓰레드 새로운 preview
  • record 패턴 매칭 새로운 preview
  • switch 패턴 매칭 새로운 preview

 

14. Java 21 - LTS

14.0 종류

  • SequencedCollection
  • 가상 쓰레드 공식 지원
  • record 패턴 매칭 공식 지원
  • swtich 패턴 매칭 공식 지원

14.1 SequencedCollection

일괄적인 방법으로 데이터 탐색 및 조작

list.getFirst();
deque.getFirst()

14.2 가상 쓰레드 공식 지원

JVM에서 관리하는 경량 쓰레드

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}

14.3 record 패턴 매칭 공식 지원

static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

14.4 Switch 패턴 매칭 공식 지원

타입 패턴 매칭 및 null 검사

static String formatterPatternSwitch(Object obj) {
    return switch (obj) {
		    case null -> "OTL";
        case Integer i -> "int";
        case Long l    -> "long"
        case Double d  -> "double"
        case String s  -> "string"
        default        -> "default"
    };
}

 

참고