Java 8 vs Java 17
Java 8의 핵심 기능 (2014년)
람다 표현식 Stream API Optional 디폴트 메서드
Java 17의 주요 특징 (2021년)
LTS(Long Term Support) 버전 Java 8 이후 누적된 모든 개선사항
주요 차이점들
- 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";
};
}
- 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"; }; } - var 키워드 (Java 10+)
```java
// Java 8
List
names = new ArrayList<>(); Map<String, Integer> scores = new HashMap<>();
// Java 17
var names = new ArrayList
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")
);
- 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+에서 추가
```
- 성능 개선 GC 개선:
Java 8: Parallel GC, G1GC Java 17: ZGC, Shenandoah GC 등 저지연 GC 추가
JVM 개선:
더 빠른 startup time 메모리 사용량 최적화 컨테이너 환경 지원 개선
- 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
- 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% 성능 향상 메모리 사용량 감소 컨테이너 환경에서 더 나은 성능