Yomni's TIL Help

Java 버젼별 특징

JAVA 8 : LTS

  • 람다 표현식(Lambda expression) : 함수형 프로그래밍을 지원하기 위해 도입

    • 익명함수 지원

  • 스트림 API : 컬렉션 데이터를 처리하는 기능 향상

  • Type Annotation : 어노테이션을 타입 선언에도 적용 가능

    • 정교한 유효성 검사

// 람다 표현식을 사용한 간단한 예제 List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach(name -> System.out.println(name)); // 스트림을 사용한 간단한 예제 List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream().filter(n -> n % 2 == 0).mapToInt(Integer::intValue).sum(); // 타입 어노테이션을 사용한 정교한 유효성 검사 class MyClass { @NotNull public String myMethod() { return "Hello, World!"; } }

JAVA 9

  • 모듈 시스템

  • JShell

  • private methods in interfaces

// 모듈 선언 module com.example.myapp { requires java.base; exports com.example.myapp.util; } // 모듈 내부의 클래스 package com.example.myapp.util; public class MyUtil { public static String sayHello() { return "Hello, Java 9 Module System!"; } } // private methods in interfaces public interface Calculator { int add(int a, int b); int subtract(int a, int b); // 두 공개 메서드에서 중복 코드를 private 메서드로 분리 default int multiply(int a, int b) { return a * b; } default double divide(int a, int b) { return (double) a / b; } private int performOperation(int a, int b, IntBinaryOperator operator) { return operator.applyAsInt(a, b); } }
$ jshell | Welcome to JShell -- Version 9 | For an introduction type: /help intro jshell> int x = 10; x ==> 10

JAVA 10

  • var를 통한 지역 변수의 타입 추론

    • 지역변수에서만 사용 가능

    • 가독성을 위한 코드에만 선언할 것

// 기존 방식 String name = "Alice"; // Java 10에서의 var 사용 var age = 30; var greeting = "Hello, World!";

JAVA 11 : LTS

  • var 키워드를 람다의 매개변수로 사용 가능

// 기존 방식 List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach((String name) -> { System.out.println("Hello, " + name); }); // Java 11에서의 var 사용 List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); names.forEach((var name) -> { System.out.println("Hello, " + name); });

JAVA 12

  • (preview 옵션 활성화) Switch expression 개선 : case 문에서 break; 를 사용하지 않고도 값을 반환.

public enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } public String getDayType(DayOfWeek day) { String type = switch (day) { case SATURDAY, SUNDAY -> "주말"; case MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY -> "평일"; }; return type; }

JAVA 13

  • Switch expression 개선 : yield 키워드 추가

String day = "MON"; int numLetters = switch (day) { case "MON", "TUE", "WED", "THU", "FRI" -> 3; case "SAT", "SUN" -> 4; default -> { System.out.println("Invalid day"); yield -1; // 해당 case 블록을 종료하고 -1을 반환합니다. } };
  • Text Blocks 추가 : 여러 줄의 텍스트를 한 줄에 정의 가능

String textBlock = """ This is a text block. It can contain multiple lines. """;

JAVA 14

  • Switch expression 개선 표준 발표

String result = switch (day) { case "MON", "TUE", "WED", "THU", "FRI" -> "Weekday"; case "SAT", "SUN" -> "Weekend"; default -> "Invalid"; };

JAVA 15

  • Text Block 개선 : 문자열 보간 및 텍스트 블록 간의 결합 가능

String name = "Alice"; String message = """ Hello, %s! This is a text block with interpolation. """.formatted(name);
  • Pattern Matching for instanceof (instanceof 패턴 매칭 업데이트): case 블록에서 추출된 변수를 null 검사와 함께 사용 가능

if (obj instanceof String str && str.length() > 5) { System.out.println("길이가 5보다 큰 문자열: " + str); }

JAVA 16

  • Pattern Matching for Enums : 열거형 값을 검사하고 일치하는 패턴 식별 가능

enum Color { RED, GREEN, BLUE } Color color = Color.RED; if (color == Color.RED) { System.out.println("The color is red."); } else if (color == Color.GREEN) { System.out.println("The color is green."); } else if (color == Color.BLUE) { System.out.println("The color is blue."); } else { System.out.println("The color is unknown."); }
  • String Pattern Matching : 문자열을 검사하고 일치하는 패턴 식별화

String input = "Hello, world!"; if (input.matches("Hello, (?<name>.*)")) { System.out.println("The name is " + input.group("name")); }
  • Record 클래스 타입 추가

record Point(int x, int y) { public Point { System.out.println("Record class is created"); } } public class Main { public static void main(String[] args) { Point p = new Point(10, 20); System.out.println(p); // Point(x=10, y=20) } }

JAVA 17 : LTS

  • sealed 클래스 타입 추가 : 특정 범위의 클래스만 상속할 수 있는 클래스

sealed abstract class Animal permits Cat, Dog { abstract void speak(); } class Cat extends Animal { @Override void speak() { System.out.println("Meow!"); } } class Dog extends Animal { @Override void speak() { System.out.println("Woof!"); } }

JAVA 18

  • Java API 문서에 예제 소스 코드 조각을 포함하는 javaDoc snippets 기능 추가

/** * This method returns the sum of two numbers. * * @param a the first number * @param b the second number * @return the sum of a and b */ int add(int a, int b) { return a + b; } /** * This is an example of how to use the add() method. * * @snippet add(10, 20) */ void example() { int sum = add(10, 20); System.out.println(sum); // prints 30 }

JAVA 19

  • Structured concurrency api 공개

    • Thread / Runnable 대체 가능

import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class StructuredConcurrencyExample { public static void main(String[] args) throws Exception { // Create a new executor service. ExecutorService executorService = Executors.newSingleThreadExecutor(); // Create a new structured task. StructuredTask<Integer> task = new StructuredTask<>(() -> { // Do some work. Thread.sleep(1000); return 10; }); // Submit the task to the executor service. Future<Integer> future = executorService.submit(task); // Wait for the task to complete. Integer result = future.get(); // Print the result. System.out.println(result); // 10 // Shutdown the executor service. executorService.shutdown(); } }

느낀점

  • 항상 자바8만 써오다가 다른 버전에선 재밌는 기능들을 많이 제공해주고 있어서 흥미로웠다.

  • 근시일 내 SpringBoot 버전 업그레이드를 목표로 하고 있는데, 이 때 JDK 버전도 가능하다면 업그레이드 해봐야겠다.

Last modified: 15 October 2024