티스토리 뷰

study

java 8 / 11 / 17

soo__ 2022. 5. 19. 21:10

자바는 하위 호환성(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
공지사항
«   2025/08   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31