Java8 vs Java11 vs Java17

람다 표현식

  • 함수형 프로그래밍 스타일을 자바에 도입

  • 예시

    // 기존 익명 클래스 방식
    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("Hello, world!");
        }
    }).start();
    
    // 람다 표현식 방식
    new Thread(() -> System.out.println("Hello, world!")).start();

스트림 API

  • 컬렉션 데이터를 함수형 스타일로 처리하는 도구

  • 주로 Filtering, Mapping, Sorting 등의 작업을 쉽게 수행할 수 있게 해줌

  • 예시

    List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "Dave");
    List<String> filteredNames = names.stream()
                                      .filter(name -> name.startsWith("A"))
                                      .collect(Collectors.toList());
    System.out.println(filteredNames); // [Alice]

신규 날짜와 시간 API

  • java.time package

  • java.util.Date와 java.util.Calendar의 복잡함과 불편함을 해결

  • 예시

    LocalDate today = LocalDate.now();
    LocalDate birthday = LocalDate.of(1990, Month.JANUARY, 1);
    Period age = Period.between(birthday, today);
    System.out.println("Age: " + age.getYears());

디폴트 메서드

  • 인터페이스에서 메서드 구현을 제공

  • 예시

    interface MyInterface {
        void existingMethod();
        
        default void newMethod() {
            System.out.println("New default method");
        }
    }
    
    class MyClass implements MyInterface {
        @Override
        public void existingMethod() {
            System.out.println("Existing method implementation");
        }
    }
    
    MyClass myClass = new MyClass();
    myClass.existingMethod(); 
    myClass.newMethod();

HttpClient 표준화

  • Java 9에서 소개되었던 HttpClient API가 Java 11에서 표준으로 채택 (기존에는 RestTemplate)

  • HTTP/1.1, HTTP/2, WebSocket 지원

var 키워드 사용 확장

  • 자바 10에서 소개되었던 var 키워드를 사용하여 지연 변수 타입을 추론할 수 있음.

여러 메서드 추가

  • String 클래스

    • isBlank(): 문자열이 공백으로만 이루어져 있는지 확인.

    • lines(): 문자열을 줄 단위로 분할하여 스트림으로 반환.

    • strip(), stripLeading(), stripTrailing(): 문자열의 앞뒤 공백을 제거.

    • repeat(int times): 문자열을 주어진 횟수만큼 반복.

    • 예시

      String str = " Hello World ";
      System.out.println(str.isBlank()); // false
      System.out.println(str.strip()); // "Hello World"
      System.out.println("Java".repeat(3)); // "JavaJavaJava"
  • Optional 클래스

    • isEmpty(): 값이 비어있는지 확인.

    • 예시

      Optional<String> optional = Optional.empty();
      System.out.println(optional.isEmpty()); // true

단일 파일 소스 코드 프로그램 실행

  • Java 11부터는 단일 파일로 작성된 소스 코드를 컴파일 없이 바로 실행할 수 있음.

    $ java HelloWorld.java

가비지 컬렉터 개선

  • ZGC

    • 매우 낮은 Latency를 목표로 설계됨 - GC 중 쓰레드가 멈추는 시간을 짧게 유지

    • 대규모 Heap 지원 - 최대 수백 GB까지 메모리를 효율적으로 관리할 수 있음

    • 사용법

      java -XX:+UseZGC -jar myapp.jar
  • Epsilon GC

    • 실험적으로 등장

Record Class

  • 간결하고 명료한 방식으로 데이터 클래스를 정의할 수 있는 새로운 클래스 유형

  • 멤버 변수는 private final

  • 필드별 getter, equal, hashCode, toString 자동 생성

  • 예시

    // 기존
    public class Person {
        private final String name;
        private final int age;
    
        public Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        public String getName() {
            return name;
        }
    
        public int getAge() {
            return age;
        }
    
        @Override
        public boolean equals(Object o) {
            ...
        }
    
        @Override
        public int hashCode() {
            ...
        }
    
        @Override
        public String toString() {
            ...
        }
    }
    
    // record
    public record Person(String name, int age) { }
    

Sealed Class

  • 봉인된 클래스를 사용하여 계층 구조를 더 염격하게 제어

  • 예시

    public abstract sealed class Shape
        permits Circle, Square { }
    
    public final class Circle extends Shape { }
    public final class Square extends Shape { }

Pattern Matching 스위치문

  • switch문에 패턴을 적용하여 유연한 매칭이 가능해짐

  • 예시

    static String formatterPatternSwitch(Object obj) {
        return switch (obj) {
            case Integer i -> String.format("int %d", i);
            case Long l    -> String.format("long %d", l);
            case Double d  -> String.format("double %f", d);
            case String s  -> String.format("String %s", s);
            default        -> obj.toString();
        };
    }

Switch Expression

  • 기존의 Switch문의 중복을 제거한 방식

// 기존
public static void printDayOfWeek(String dayOfWeek) {
    switch (dayOfWeek) {
        case "Monday":
        case "Tuesday":
        case "Wednesday":
        case "Thursday":
        case "Friday":
            System.out.println("평일입니다.");
            break;
        case "Saturday":
        case "Sunday":
            System.out.println("주말입니다.");
            break;
    }
    
// Java 17
public static void printDayOfWeek(String dayOfWeek) {
    switch (dayOfWeek) {
        case "Monday", "Tuesday", "Wednesday", "Thursday", "Friday" 
            -> System.out.println("평일입니다.");
        case "Saturday", "Sunday"
            -> System.out.println("주말입니다.");
    }

Last updated