자바 8 및 그 이후의 기능
자바 8 및 그 이후 버전들은 자바 언어와 플랫폼에 많은 중요한 기능 개선과 신기능을 도입하여 개발 생산성과 코드 가독성을 크게 향상시켰습니다.
아래에서는 자바 8을 시작으로 이후 주요 버전에 추가된 기능들을 중심으로 정리하였습니다.
--- 자바 8 (Java SE 8, 2014년 출시) 자바 8은 자바 역대 버전 중 가장 큰 혁신을 가져온 버전으로 평가받으며, 주요 특징은 다음과 같습니다.
1. 람다 표현식 (Lambda Expressions) - 함수형 프로그래밍 스타일을 도입하여 익명 함수를 간결하게 표현 가능. - 기존 익명 클래스(Anonymous Class)를 대체하며 코드가 훨씬 간결하고 가독성이 좋아짐. - 문법: `(parameters) -> expression` 또는 `(parameters) -> { statements }` ```java List list = Arrays.asList("a", "b", "c"); list.forEach(s -> System.out.println(s)); ``` 2. 함수형 인터페이스 (Functional Interfaces) - 단 하나의 추상 메서드만을 가진 인터페이스에 `@FunctionalInterface` 애노테이션을 붙여 람다 표현식과 함께 사용. - `java.util.function` 패키지에 여러 미리 정의된 함수형 인터페이스 제공 (e.g. `Predicate`, `Function`, `Consumer`, `Supplier` 등). 3. 스트림 API (Streams API) - 컬렉션 데이터를 선언형으로 처리할 수 있는 API. - 데이터 소스를 추상화하여 필터링(filter), 매핑(map), 정렬(sorted), 집계(reduce) 등 다양한 작업을 파이프라인으로 처리. - 병렬 처리(parallel stream)를 지원하여 멀티코어 프로세서 활용 가능. ```java List names = Arrays.asList("Alice", "Bob", "Charlie"); List filtered = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList()); ``` 4. Optional 클래스 - null에 대한 처리를 안전하게 하기 위해 도입. - null로 인한 `NullPointerException` 방지 및 명시적 null 처리 유도. ```java Optional optional = Optional.ofNullable(getName()); optional.ifPresent(name -> System.out.println(name)); ``` 5. 새로운 날짜와 시간 API (`java.time` 패키지) - 기존 `java.util.Date`와 `java.util.Calendar`의 문제점을 개선. - 불변(immutable) 객체로 설계되어 스레드 안전. - `LocalDate`, `LocalTime`, `LocalDateTime`, `ZonedDateTime` 등 다양한 날짜/시간 클래스 제공. 6. 인터페이스의 디폴트 메서드 (Default Methods) - 인터페이스에 `default` 키워드를 이용해 구현을 포함한 메서드를 선언 가능. - 기존 인터페이스에 새로운 메서드를 추가해도 구현 클래스를 깨뜨리지 않도록 설계. --- 자바 9 (2017년 출시) 1. 모듈 시스템 (Project Jigsaw) - `module-info.java`를 통한 모듈 관리로 코드의 캡슐화와 배포 단위 개선. - JDK 내부도 모듈화되어 경량화 및 보안성 강화. 2. JShell (인터랙티브 REPL) - 자바 코드를 즉시 실행하며 테스트할 수 있는 셸 환경 제공. - 학습 및 프로토타입 작성에 유용. 3. 인터페이스 private 메서드 - 인터페이스 내에서 구현하는 private 메서드를 지원해 디폴트 메서드와 정적 메서드의 코드 중복 감소. 4. 스트림 API 개선 - `takeWhile()`, `dropWhile()`, `iterate()` 등 새로운 메서드 추가. --- 자바 10 (2018년 출시) 1. 지역 변수 타입 추론 (`var`) - 지역 변수 선언 시 자료형을 명시하지 않고 컴파일러가 추론하도록 허용. - 읽기 쉬운 코드 작성 가능. ```java var list = new ArrayList(); ``` 2. 가비지 컬렉션 개선 - 플랫폼에 따른 기본 GC 변경(G1 GC가 기본 GC 됨). --- 자바 11 (2018년 출시, LTS) 1. 문자열 메서드 추가 - `String` 클래스에 `isBlank()`, `lines()`, `strip()`, `repeat(int)` 등 유용한 메서드 추가. 2. HTTP 클라이언트 표준화 - 자바 9에서 도입된 HTTP/2 클라이언트 API (`java.net.http.HttpClient`)를 표준 API로 채택. 3. 실행 파일 생성 개선 - `.java` 파일만으로도 컴파일 없이 실행 가능 (`java Hello.java`). --- 자바 12 ~ 17 주요 개선 (LTS: 자바 17) 1. Switch 표현식 (자바 14) - `switch` 문을 표현식으로 사용 가능하며, 화살표 구문(`->`) 지원으로 간결화. ```java int numLetters = switch(day) { case MONDAY, FRIDAY, SUNDAY -> 6; case TUESDAY -> 7; default -> 0; }; ``` 2. 기록 클래스 (Records, 자바 16) - 불변 데이터 클래스 생성 시 보일러플레이트 코드 최소화. - 자동으로 생성자, getter, `equals()`, `hashCode()`, `toString()` 메서드 제공. ```java public record Point(int x, int y) { } ``` 3. 패턴 매칭 (Pattern Matching) - `instanceof`와 `switch`문에서 타입 검사 후 캐스팅을 자동화. ```java if (obj instanceof String s) { System.out.println(s.toUpperCase()); } ``` 4. 텍스트 블록 (Text Blocks, 자바 15) - 여러 줄 문자열 입력 시 """(triple quotes) 사용하여 가독성 향상. ```java String json = """ { "name": "Alice", "age": 30 } """; ``` --- 그 이후 버전 (자바 18~20) - 기능 미리보기(Preview Features) 가 활성화되어 새로운 언어 기능이 실험적으로 제공. - 주요 기능으로는 패턴 매칭 switch 완전 도입 , 외부 함수 인터페이스 (Foreign Function & Memory API) , 벡터 API 등이 있습니다.
- 자바는 6개월 주기로 신규 버전을 출시하며, 장기 지원(LTS) 버전은 3년마다 배포됩니다.
--- 요약 | 버전 | 주요 기능 및 특징 | |-------|------------------------------------------| | 자바 8 | 람다, 스트림, Optional, 새로운 시간 API, 인터페이스 디폴트 메서드 등 | | 자바 9 | 모듈 시스템, JShell, 인터페이스 private 메서드, 스트림 개선 | | 자바 10| 지역 변수 타입 추론 (`var`), GC 개선 | | 자바 11| HTTP 클라이언트, 문자열 메서드 추가, 런타임 실행 파일 | | 자바 14| Switch 표현식, 텍스트 블록 프리뷰 | | 자바 15| 텍스트 블록 공식 지원 | | 자바 16| 레코드 (Records), 패턴 매칭 개선 | | 자바 17| LTS 버전, sealed 클래스, 패턴 매칭 추가 | --- 자바 8이후 도입된 기능들은 자바 언어가 단순한 객체지향 언어에서 함수형 프로그래밍, 선언형 스타일을 지원하는 현대적인 언어로 진화하는 계기가 되었습니다.
최신 버전으로 갈수록 코드 간결화, 안전성, 성능 및 병행성 지원이 강화되고 있어, 개발하는 프로젝트의 필요에 따라 적절한 자바 버전을 선택해 사용하면 좋습니다.