TokyoAJ

도쿄아재

SPRINGBOOT 2025.09.20

Java 버전별 특징 (Java 8 → 17)

실무에서 바로 쓰는 예제와 함께 핵심만 콕콕!


Java 8 (2014)

1) 람다식 (Lambda)

List<String> list = Arrays.asList("apple","banana","orange");
list.forEach(str -> System.out.println(str));
  1. forEach람다를 넘겨 각 요소를 출력합니다.
  2. 익명 클래스 대비 간결/가독성 향상.

2) Stream API

List<String> list = Arrays.asList("apple","banana","orange");
long count = list.stream().filter(str -> str.length() > 5).count();
System.out.println(count);
  1. stream()으로 지연 평가 파이프라인 구성 → filter(중간), count(종단).
  2. 원본 컬렉션을 변경하지 않고 선언형으로 가공.

3) 메서드 참조

list.forEach(System.out::println);
  1. s -> System.out.println(s)의 축약형. 자주 쓰는 람다를 더 짧게.

4) Optional

String str = null;
Optional<String> optional = Optional.ofNullable(str);
System.out.println(optional.isPresent());
  1. 널 가능 값을 감싸 널 분기를 선언적으로 처리.
  2. 실전 팁: orElse, orElseGet, ifPresent, orElseThrow 활용.


Java 9 (2017)

1) 모듈 시스템 (Jigsaw)

module com.example.mymodule {
requires org.apache.commons.lang3;
exports com.example.mypackage;
}
  1. requires의존 모듈, exports공개 패키지 명시.
  2. jlink경량 런타임 이미지 제작 가능.

2) 인터페이스 개선 (private 메서드)

public interface MyInterface {
default void myMethod() { doSomething(); }
private void doSomething() { /* ... */ }
}
  1. 인터페이스 내부 중복 로직 재사용 용이.


Java 10 (2018)

1) var 지역 변수 타입 추론

var str = "Hello, World!";
var list = Arrays.asList("apple","banana","orange");
  1. 컴파일 타임에 타입이 고정됩니다(동적 타입 아님).
  2. 초기화식이 반드시 필요. 지역 변수에만 사용.

2) 익명 클래스와 조합(개념)

interface MyInterface { void myMethod(); }
MyInterface m = new MyInterface() { public void myMethod() { /* ... */ } };
  1. 람다로 대체 못하는 상태/다중 메서드 상황에서 유용.


Java 11 (2018, LTS)

1) HTTP Client (HTTP/2)

HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("<https://www.example.com/>"))
.build();
HttpResponse<String> response =
client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());
  1. 표준 HTTP 클라이언트. 동기/비동기 지원, HTTP/2 가능.
  2. 타임아웃/리다이렉트/프록시 등 빌더 옵션으로 제어.

2) 람다 파라미터에서 var 사용 가능

BiFunction<Integer,Integer,Integer> add = (var a, var b) -> a + b;
  1. 파라미터에 일관된 어노테이션 부착 등의 목적.

주의: “var는 초기화 없이 선언 가능”은 사실이 아닙니다.

지역 변수 var는 초기화식이 필요합니다.


Java 12 (2019)

1) switch 표현식 (Preview)

int numLetters = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> 6;
case TUESDAY -> 7;
case THURSDAY, SATURDAY -> 8;
case WEDNESDAY -> 9;
default -> 0;
};
  1. 화살표 문법, multi-label, 값 반환 지원.
  2. break 필요 없음(비-폴스루).

2) G1 GC 최적화

  1. 영역 기반 힙으로 일시중지 시간 단축.


Java 13 (2019)

1) 텍스트 블록 (Preview)

String html = """
<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
""";
  1. 멀티라인 문자열을 가독성 있게 작성.

2) yieldswitch 블록에서 값 반환

String result = switch (day) {
case MONDAY, FRIDAY, SUNDAY -> "Start coding.";
case TUESDAY -> { yield "It's Tuesday."; }
default -> "Almost there.";
};


Java 14 (2020)

1) instanceof 패턴 매칭 (Preview)

if (obj instanceof String s) {
System.out.println(s.toUpperCase());
}
  1. 검사 + 캐스팅을 한 번에. 보일러플레이트 제거.

2) record (Preview)

public record Person(String name, int age) {}
  1. 불변 데이터 캐리어. equals/hashCode/toString/accessor 자동 생성.


Java 15 (2020)

1) Sealed 클래스 (Preview)

public abstract sealed class Shape permits Circle, Rectangle, Square {}
final class Circle extends Shape {}
  1. 하위 타입을 명시적으로 제한하여 안정적인 계층 설계.

2) Hidden Classes (JEP 371)

  1. 프레임워크가 런타임 생성 클래스를 안전하게 다루도록 지원.

3) Foreign-Memory Access API (Incubator)

  1. 네이티브 메모리를 안전 모델로 접근(이후 버전서 API 변화 지속).

주의(중요): record는 다른 클래스 상속 불가입니다.

record Employee ... extends Person 코드는 컴파일 오류입니다.

implements 인터페이스는 가능.


Java 16 (2021)

1) record 정식

public record Person(String name, int age) {
public Person {
if (age < 0) throw new IllegalArgumentException();
}
}
  1. 컴팩트 생성자로 불변성 검증 삽입 가능.
  2. 동등성/출력/접근자 자동 생성.

2) Vector API (Incubator)

import jdk.incubator.vector.*;
var sp = FloatVector.SPECIES_256;
FloatVector a = FloatVector.broadcast(sp, 1.0f);
FloatVector b = FloatVector.broadcast(sp, 2.0f);
System.out.println(a.mul(b));
  1. SIMD 연산을 고수준으로 이용 → 수치/ML 계산 고성능.

3) Foreign Linker API (Incubator)

  1. C 함수 호출/콜백을 JNI보다 간단하고 타입 안전하게.

4) JEP 390: 값-기반 클래스 경고

  1. Integer 등 값-기반 클래스의 잘못된 사용에 경고.


Java 17 (2021, LTS)

1) Sealed 클래스 정식화

public sealed class Shape permits Circle, Rectangle, Triangle {}
final class Circle extends Shape {}
final class Rectangle extends Shape {}
non-sealed class Triangle extends Shape {}
  1. 상속 트리 폐쇄성 확보 → 보안/유지보수 이점.

2) Pattern Matching for switch (Preview)

  1. switch에서 타입/조건 패턴으로 분기(이후 버전에서 성숙).

3) Vector API 업데이트

import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorOperators;
var sp = FloatVector.SPECIES_PREFERRED;
var v = FloatVector.broadcast(sp, 3.0f)
.lanewise(VectorOperators.LOGARITHM_BASE_E);
System.out.println(v);
  1. lanewise로 각 lane에 연산 적용.

4) Foreign Function & Memory API (Incubator)

  1. 네이티브 메모리/함수 상호운용을 표준화 방향으로 발전.

요약

  1. Java 8: 람다/스트림/Optional — 함수형 도입
  2. Java 9: 모듈 — 경계 명확화, jlink 경량화
  3. Java 10–11: var, 표준 HTTP Client
  4. Java 12–13: switch 표현식/yield, 텍스트 블록
  5. Java 14–16: instanceof 패턴 매칭, record 정식, Vector/FFM(incubator)
  6. Java 17(LTS): Sealed 정식화, 장기 지원의 기준점


댓글