Java 8 vs Java 17

Java 8의 핵심 기능 (2014년)

람다 표현식 Stream API Optional 디폴트 메서드

Java 17의 주요 특징 (2021년)

LTS(Long Term Support) 버전 Java 8 이후 누적된 모든 개선사항

주요 차이점들

  1. Records (Java 14+)
    // Java 8
    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 obj) { /* 구현 */ }
     @Override
     public int hashCode() { /* 구현 */ }
     @Override
     public String toString() { /* 구현 */ }
    }
    
// Java 17
public record Person(String name, int age) {
    // 생성자, getter, equals, hashCode, toString 자동 생성!
}
2. Text Blocks (Java 15+)
java// Java 8
String html = "<html>\n" +
              "  <body>\n" +
              "    <h1>Hello World</h1>\n" +
              "  </body>\n" +
              "</html>";

// Java 17
String html = """
              <html>
                <body>
                  <h1>Hello World</h1>
                </body>
              </html>
              """;
3. Switch 표현식 (Java 14+)
public String getDayType(String day) {
    String result;
    switch (day) {
        case "MONDAY":
        case "TUESDAY":
        case "WEDNESDAY":
        case "THURSDAY":
        case "FRIDAY":
            result = "Weekday";
            break;
        case "SATURDAY":
        case "SUNDAY":
            result = "Weekend";
            break;
        default:
            result = "Invalid";
    }
    return result;
}
// Java 17
public String getDayType(String day) {
    return switch (day) {
        case "MONDAY", "TUESDAY", "WEDNESDAY", "THURSDAY", "FRIDAY" -> "Weekday";
        case "SATURDAY", "SUNDAY" -> "Weekend";
        default -> "Invalid";
    };
}
  1. Pattern Matching (Java 16+)
    // Java 8
    public String formatValue(Object obj) {
     if (obj instanceof String) {
         String s = (String) obj;  // 캐스팅 필요
         return "String: " + s;
     } else if (obj instanceof Integer) {
         Integer i = (Integer) obj;  // 캐스팅 필요
         return "Integer: " + i;
     }
     return "Unknown";
    }
    
    // Java 17
    public String formatValue(Object obj) {
     return switch (obj) {
         case String s -> "String: " + s;      // 자동 캐스팅!
         case Integer i -> "Integer: " + i;    // 자동 캐스팅!
         default -> "Unknown";
     };
    }
    
  2. var 키워드 (Java 10+) ```java // Java 8 List names = new ArrayList<>(); Map<String, Integer> scores = new HashMap<>();

// Java 17 var names = new ArrayList(); // 타입 추론 var scores = new HashMap<String, Integer>();


6. Optional 개선
```java
// Java 8
Optional<String> optional = Optional.of("Hello");
if (optional.isPresent()) {
    System.out.println(optional.get());
} else {
    System.out.println("Empty");
}

// Java 17
optional.ifPresentOrElse(
    System.out::println,
    () -> System.out.println("Empty")
);
  1. Stream API 개선 ```java // Java 17에 추가된 메서드들 List items = List.of("a", "b", "c"); // of() 메서드

// takeWhile, dropWhile Stream.of(1, 2, 3, 4, 5) .takeWhile(x -> x < 4) // [1, 2, 3] .toList(); // Java 16+에서 추가

```

  1. 성능 개선 GC 개선:

Java 8: Parallel GC, G1GC Java 17: ZGC, Shenandoah GC 등 저지연 GC 추가

JVM 개선:

더 빠른 startup time 메모리 사용량 최적화 컨테이너 환경 지원 개선

  1. HTTP Client (Java 11+) java// Java 8 (외부 라이브러리 필요) // HttpURLConnection 또는 Apache HttpClient

// Java 17 (내장) HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(URI.create(“https://api.example.com/data”)) .build();

HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());

  1. Sealed Classes (Java 17) java// Java 17 public sealed class Shape permits Circle, Rectangle, Triangle { }

public final class Circle extends Shape { } public final class Rectangle extends Shape { }
public final class Triangle extends Shape { } // 다른 클래스는 Shape을 상속받을 수 없음! 실무에서의 차이 개발 생산성

Records: DTO 클래스 작성 시간 단축 Text Blocks: SQL, JSON, HTML 작성 편의성 Switch 표현식: 더 간결한 분기 처리 var: 타입 추론으로 코드 간소화

성능

Java 17: 전반적으로 10-15% 성능 향상 메모리 사용량 감소 컨테이너 환경에서 더 나은 성능