티스토리 뷰
자바는 하위 호환성(backward compatible)이 매우 높다. java 8 프로그램이 java 8~ 이상에서 실행되도록 보장한다.
LTS(Long Term Support) 장기 지원 버전인 8, 11, 17에 대해 조사해보았다.
java 8
- Lambda Expression
- 메소드를 하나의 식으로 표현한 것으로, 메소드를 하나의 변수 처럼 사용이 가능하다
- 인스턴스::메소드명 으로 메소드 참조가 가능
- 새로운 날짜/시간 API (LocalDateTime, …)
- Interface Default Method 추가
- 인터페이스에 default / static 메소드 정의 가능
- default는 오버라이딩이 가능하지만 static은 불가능하다
- PermGen 영역 삭제 ->Metaspace로 대체되었다
- 런타임 시 메모리 요구사항에 따라 크기를 조정
- 현재까지 로드한 class들의 메타데이터를 저장
- OS 레벨에서 관리되는 Native 메모리 영역에 위치(JVM에 의해 관리되는 Heap 영역이 아님)
- Stream API
- 컬렉션의 저장요소를 하나씩 참조하여 람다식으로 처리할 수 있도록 해주는 내부반복자(반복이 컬렉션 내부에서 발생하도록)
- Optional
- null에 대한 참조를 안전하게 할 수 있도록 해줌
- 배열 정렬의 병렬 처리
- Arrays.parallelSort()를 통해 병렬적으로 배열 정렬할 수 있도록 지원
- Paralle GC 기본으로 사용
- YoungGen의 GC를 멀티 스레드 방식을 사용
- 32비트를 지원하는 마지막 공식 Java버전
java 11
- Oracle JDK의 구독형 유료 모델로 전환
- Java 11 부터 요금 정책이 바뀌었기 때문에, 외부 개발 툴과의 연동성을 위해(Oracle JDK가 아닌 Open JDK를 사용해야 하면서 생기는 이슈) Java 8이 여전히 큰 파이를 차지
- Java 소스 파일을 먼저 컴파일(javac)하지 않고도 실행 가능
- java MyScript.java 실행 가능
- 람다식에서 로컬 변수 var 사용 가능
- String / Files 클래스에 새로운 메소드 추가
- 컬랙션 인터페이스, 메소드 추가
- 컬랙션의 toArray() 메소드를 오버로딩하는 메소드가 추가
- Predicate 인터페이스, static not 메소드(부정을 나타내는 메소드) 추가
- 중첩클래스들이 접근지정자에 상관없이 서로의 필드에 접근 가능
- G1 GC 기본으로 사용
- Gen을 물리적으로 구분하지 않고 논리적으로 균등하게 지역을 나누어 역할을 부여하고 GC 병렬적으로 처리
java 17
- 스위치문 패턴 매칭 (Preview; 실행하려면 명령어 옵션 추가 필요)
- null에 대해서도 좀 더 간편하게 핸들링 가능
- 스위치문을 사용하여 스위치에서 값을 반환하고 할당 등에서 값을 사용할 수 있음
- instanceof 체크 시 변수를 생성할 수 있어 캐스팅 단계 간소화
- Sealed Classes 봉인 클래스
- 확장(extends) 하거나 구현(implements) 할 수 있는 클래스 또는 인터페이스를 제한
- 기존 final 키워드를 통해 상속을 제한할 수 있었지만, sealed(봉인) 클래스는 permitted(허용된) 서브 클래스에게만 확장을 허용하고 다른 클래스에는 봉인하는 형태이다
- 이때 몇가지 규칙이 따른다
- sealed 클래스와 permitted 서브 클래스는 동일한 모듈 또는 패키지에 속해야한다
- 모든 permitted 서브 클래스는 sealed 클래스를 extends해야한다. 그렇지 않으면 컴파일 오류가 발생한다
- 모든 permitted 서브 클래스는 수퍼 클래스에 의해 시작된 봉인을 계속할지 말지 선언해야한다
(더이상 확장되지 않도록 final을 적용하거나, non-sealed로 선언하여 다른 클래스가 확장하도록 허용하거나, 자신도 sealed 클래스로 선언될 수 있음)
- 텍스트 블록 지원
- 기존 Json 문자열을 직접 생성할 때 \(이스케이프) 처리로 가독성이 떨어지던 문제를 개선
- record 선언 기능 추가
- data object
- 코드를 간결하게 만들기 위해 사용하던 롬복 기능을 사용하지 않아도 잠재적으로 getter/setter, equals/hashcode, toString을 포함하는 클래스로 선언할 수 있다
- Stream.toList() 메서드 추가
'study' 카테고리의 다른 글
map() 과 flatMap() (0) | 2022.05.17 |
---|---|
ConcurrentHashMap (0) | 2022.05.03 |
JVM과 GC (0) | 2022.04.28 |
Builder 패턴 (0) | 2022.04.27 |
Stateless vs Stateful (0) | 2022.04.22 |