JAVA 8, 11, 17
코딩테스트를 보면 java 8 이상이라는 말이 많다. 프로젝트를 할 때도 java8, 11, 17을 사용하는 경우가 많습니다. 자바에는 여러 버전이 있지만 그중 8, 11, 17을 제일 많이 사용합니다. 왜냐하면 이 3개의 버전이 LTS(Long Term Support)이기 때문입니다.
LTS란 이 버즌은 출시 이후 8년간 보안 업데이트와 버그 수정을 지원해 준다는 뜻입니다.
- java 8 : 2030년 12월
- java11 : 2026년 9월
- java17 : 2029년 9월
이레서 java8 대신 사용하는 것이 java11이 아닌 java17입니다.
자바 8 (Java 8)
- 32bit를 지원하는 마지막 공식 Java 버전
- 오라클이 자바 인수 후 출시한 첫 번째 LTS 버전
- Oracle JDK(Oracle사에서 지원하는 버전으로 유료) , Open JDK(오픈소스 기반의 무료)로 나뉨
- 람다 표현식 (Lambda Expressions): 익명 함수를 지원하여 함수형 프로그래밍을 간결하게 지원.
- 스트림 API (Stream API): 컬렉션 처리를 함수형으로 처리할 수 있도록 지원하며, 병렬 처리를 통한 성능 향상 가능.
- 날짜와 시간 API (Date and Time API): Joda-Time을 기반으로 새로운 날짜와 시간 API 도입.
- 디폴트 메서드 (Default Methods): 인터페이스에 디폴트 메서드를 추가하여 기존 인터페이스의 수정 없이 새로운 기능 추가 가능.
- 메서드 참조 (Method References): 람다 표현식을 간결하게 표현하는 기능으로 특정 메서드를 참조하여 대체 가능.
- 제어 구조 개선 (Control Structure Enhancements): if-else 문과 switch 문의 개선으로 코드를 더 간결하게 작성 가능.
자바 11 (Java 11)
- Oracle JDK와 Open JDK 통합
- HTTP 클라이언트 API (HTTP Client API): 새로운 HTTP 클라이언트 API를 도입하여 HTTP/2를 지원하고, 비동기 및 논블로킹 작업을 통해 성능 향상을 제공합니다.
- 지역 변수 문법 개선 (Local Variable Syntax for Lambda Parameters): var 키워드를 사용하여 람다 표현식의 매개변수를 더 간결하게 작성 가능.
- 지역 변수 문법 개선 (Local Variable Syntax for Variables): var 키워드를 사용하여 지역 변수의 타입을 추론하여 작성 가능.
자바17 (Java 17)
- 스위치 문 개선 (Switch Expressions): 스위치 문을 표현식으로 사용할 수 있게 되어 더 간결한 코드 작성이 가능해집니다.
- Sealed 클래스 (Sealed Classes): 클래스를 sealed로 선언하여 클래스의 확장을 명시적으로 허용하는 것으로 제한할 수 있습니다.
- 패턴 매칭 (Pattern Matching): instanceof 연산자를 개선하여 패턴에 따라 동작을 분기할 수 있는 기능을 제공합니다.
- 메모리 압축 (ZGC: Garbage Collector): Z Garbage Collector를 기본으로 지원하여 메모리 압축 기능을 제공합니다.
Sealed 클래스
- 상속 제한: Sealed 클래스는 자신을 상속하는 클래스들을 미리 명시하여, 오직 지정된 클래스들만이 상속할 수 있도록 제한합니다. 즉, Sealed 클래스는 허용된 하위 클래스들을 명시적으로 선언합니다.
- sealed 키워드: 클래스 선언 시 sealed 키워드를 사용하여 해당 클래스를 sealed로 지정할 수 있습니다.
- permits 키워드: sealed 클래스를 상속하는 클래스들은 permits 키워드를 사용하여 허용된 하위 클래스를 명시해야 합니다.
Sealed 클래스를 사용하면 클래스 상속의 구조를 명확하게 정의할 수 있습니다. 이를 통해 미리 지정된 하위 클래스들만이 상속할 수 있기 때문에, 더욱 안정적인 클래스 디자인을 구축할 수 있습니다. 또한, sealed 클래스는 패턴 매칭(Pattern Matching)과 함께 사용하여 switch 표현식 등에서 더욱 효율적이고 가독성 높은 코드를 작성할 수 있게 합니다.
sealed class Shape permits Circle, Square {
// ...
}
final class Circle extends Shape {
// ...
}
final class Square extends Shape {
// ...
}
패턴 매칭
- 패턴 매칭(Pattern Matching)은 Java 16부터 미리보기 기능으로 도입된 기능으로, instanceof 연산자를 개선하여 객체의 타입을 체크하고 해당 타입에 따라 동작을 분기할 수 있는 기능을 제공합니다.
- 기존의 instanceof 연산자는 주어진 객체가 특정 클래스나 인터페이스의 인스턴스인지를 확인하는 용도로 사용됩니다. 그러나 instanceof 연산자는 객체의 타입을 확인하더라도 해당 타입에 따라 자동으로 해당 타입으로 형변환을 해주지는 않습니다. 따라서 instanceof 연산자를 사용한 이후에는 별도로 형변환을 수행해주어야 합니다.
- 패턴 매칭은 이러한 불편함을 해소하기 위해 도입된 기능으로, instanceof 연산자와 switch 표현식을 조합하여 객체의 타입을 체크하고 해당 타입으로 자동 형변환을 수행하는 기능을 제공합니다. 이를 통해 더욱 간결하고 가독성이 좋은 코드를 작성할 수 있습니다.
class Shape { /* Shape 클래스의 정의 */ }
class Circle extends Shape { /* Circle 클래스의 정의 */ }
class Square extends Shape { /* Square 클래스의 정의 */ }
public static void printArea(Shape shape) {
if (shape instanceof Circle c) {
System.out.println("Circle area: " + (Math.PI * c.getRadius() * c.getRadius()));
} else if (shape instanceof Square s) {
System.out.println("Square area: " + (s.getSide() * s.getSide()));
} else {
System.out.println("Unknown shape");
}
}
'JAVA 공부' 카테고리의 다른 글
상속에 대해(1) (0) | 2023.08.13 |
---|---|
메모리 사용 영역에 대해 (0) | 2023.08.08 |
JVM, JRE, JDK에 대해서 (0) | 2023.08.03 |
스트림이란? (1) (1) | 2023.07.11 |
람다식이란? (0) | 2023.07.09 |