실무에서 바로 쓰는 예제와 함께 핵심만 콕콕!
Java 8 (2014)
1) 람다식 (Lambda)
List<String> list = Arrays.asList("apple","banana","orange");
list.forEach(str -> System.out.println(str));
forEach
에 람다를 넘겨 각 요소를 출력합니다.- 익명 클래스 대비 간결/가독성 향상.
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);
stream()
으로 지연 평가 파이프라인 구성 → filter
(중간), count
(종단).- 원본 컬렉션을 변경하지 않고 선언형으로 가공.
3) 메서드 참조
list.forEach(System.out::println);
s -> System.out.println(s)
의 축약형. 자주 쓰는 람다를 더 짧게.
4) Optional
String str = null;
Optional<String> optional = Optional.ofNullable(str);
System.out.println(optional.isPresent());
- 널 가능 값을 감싸 널 분기를 선언적으로 처리.
- 실전 팁:
orElse
, orElseGet
, ifPresent
, orElseThrow
활용.
Java 9 (2017)
1) 모듈 시스템 (Jigsaw)
module com.example.mymodule {
requires org.apache.commons.lang3;
exports com.example.mypackage;
}
requires
로 의존 모듈, exports
로 공개 패키지 명시.jlink
로 경량 런타임 이미지 제작 가능.
2) 인터페이스 개선 (private 메서드)
public interface MyInterface {
default void myMethod() { doSomething(); }
private void doSomething() { }
}
- 인터페이스 내부 중복 로직 재사용 용이.
Java 10 (2018)
1) var
지역 변수 타입 추론
var str = "Hello, World!";
var list = Arrays.asList("apple","banana","orange");
- 컴파일 타임에 타입이 고정됩니다(동적 타입 아님).
- 초기화식이 반드시 필요. 지역 변수에만 사용.
2) 익명 클래스와 조합(개념)
interface MyInterface { void myMethod(); }
MyInterface m = new MyInterface() { public void myMethod() { } };
- 람다로 대체 못하는 상태/다중 메서드 상황에서 유용.
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());
- 표준 HTTP 클라이언트. 동기/비동기 지원, HTTP/2 가능.
- 타임아웃/리다이렉트/프록시 등 빌더 옵션으로 제어.
2) 람다 파라미터에서 var
사용 가능
BiFunction<Integer,Integer,Integer> add = (var a, var b) -> a + b;
- 파라미터에 일관된 어노테이션 부착 등의 목적.
주의: “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;
};
- 화살표 문법, multi-label, 값 반환 지원.
- break 필요 없음(비-폴스루).
2) G1 GC 최적화
- 영역 기반 힙으로 일시중지 시간 단축.
Java 13 (2019)
1) 텍스트 블록 (Preview)
String html = """
<html>
<body>
<h1>Hello, world!</h1>
</body>
</html>
""";
- 멀티라인 문자열을 가독성 있게 작성.
2) yield
로 switch
블록에서 값 반환
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());
}
- 검사 + 캐스팅을 한 번에. 보일러플레이트 제거.
2) record
(Preview)
public record Person(String name, int age) {}
- 불변 데이터 캐리어.
equals/hashCode/toString
/accessor 자동 생성.
Java 15 (2020)
1) Sealed 클래스 (Preview)
public abstract sealed class Shape permits Circle, Rectangle, Square {}
final class Circle extends Shape {}
- 하위 타입을 명시적으로 제한하여 안정적인 계층 설계.
2) Hidden Classes (JEP 371)
- 프레임워크가 런타임 생성 클래스를 안전하게 다루도록 지원.
3) Foreign-Memory Access API (Incubator)
- 네이티브 메모리를 안전 모델로 접근(이후 버전서 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();
}
}
- 컴팩트 생성자로 불변성 검증 삽입 가능.
- 동등성/출력/접근자 자동 생성.
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));
- SIMD 연산을 고수준으로 이용 → 수치/ML 계산 고성능.
3) Foreign Linker API (Incubator)
- C 함수 호출/콜백을 JNI보다 간단하고 타입 안전하게.
4) JEP 390: 값-기반 클래스 경고
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 {}
- 상속 트리 폐쇄성 확보 → 보안/유지보수 이점.
2) Pattern Matching for switch
(Preview)
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);
lanewise
로 각 lane에 연산 적용.
4) Foreign Function & Memory API (Incubator)
- 네이티브 메모리/함수 상호운용을 표준화 방향으로 발전.
요약
- Java 8: 람다/스트림/Optional — 함수형 도입
- Java 9: 모듈 — 경계 명확화, jlink 경량화
- Java 10–11:
var
, 표준 HTTP Client - Java 12–13:
switch
표현식/yield
, 텍스트 블록 - Java 14–16:
instanceof
패턴 매칭, record
정식, Vector/FFM(incubator) - Java 17(LTS): Sealed 정식화, 장기 지원의 기준점
댓글