Java 버전별 차이와 특징

2023. 6. 15. 06:13[개발] 지식/Java

Java 버전 특징

  • Java는 하위 호환성이 높다
    • Java 5 또는 8버전이 8~17버전의 가상환경에서 구동되는 것이 보장된다
    • 이를 backward compatible(하위 호환성) 이라고 한다.
    • 반대로 8버전에서 사용할 수 없는 17 기능을 사용한다면 컴파일되지 않는다.
      • java.lang.UnsupportedClassVersionError
  • 가장 변경 사항이 큰 8버전을 기준으로 학습하고, 이후 버전의 변경사항만 알아두는 것으로 충분

배포(Distribution)

OpenJDK 프로젝트

  • 이는 배포판이 아닌 소스 자체
  • 소스를 기반으로 빌드를 만들어 배포할 수 있지만 호환성 인증을 확보하기 어려움

OpenJDK 빌드(오라클), OracleJDK

  • OracleJDK는 유료, OpenJDK는 무료
  • Oracle JDK의 라이선스는 Oracle BCL(Binary Code License) Agreement이지만, OpenJDK의 라이선스는 Oracle GPL v2
  • Oracle JDK는 LTS(장기 지원) 업데이트 지원을 받을 수 있지만, OpenJDK는 LTS 없이 6개월마다 새로운 버전을 배포
  • Oracle JDK는 Oracle이 인수한 Sun Microsystems 플러그인을 제공하지만, OpenJDK는 제공하지 않음
  • Oracle JDK는 OpenJDK 보다 CPU 사용량과 메모리 사용량이 적고, 응답시간이 높다.
  • Java 8버전 이후는 OracleJDK와 OpenJDK간 본질적인 차이가 없음

Adoptium (formerly AdoptOpenJDK)

  • 2017년에 자바 유저 그룹 멤버, 개발자, 벤더(아마존, 마이크로소프트, 피보탈, 레드햇 등)로 구성된 그룹이 AdoptOpenJDK라는 커뮤니티를 시작 → 현 Eclipse Adoptium 프로젝트
  • 보다 긴 가용성/업데이트를 갖춘 강력한 무료 OpenJDK 빌드를 제공하며 다음과 같은 두 가지 Java 가상 머신도 선택 가능

Azul Zulu, Amazon Corretto, SAPMachine

그 외 주목할만한 배포판

버전별 특징

Java 8(1.8)

  • Lambda
  • stream
  • interface default method
  • Optional
  • new Date and Time API(LocalDateTime, …)

Lambda

Runnable runnable = new Runnable(){
   @Override
   public void run(){
     System.out.println(*"Hello world !"*);
   }
 };
Runnable runnable = () -> System.out.println(*"Hello world two!"*);

Stream

List<String> list = Arrays.asList(*"franz"*, *"ferdinand"*, *"fiel"*, *"vom"*, *"pferd"*);
list.stream()
    .filter(name -> name.startsWith(*"f"*))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

자바 8은 스트림 API를 통해 컬렉션을 처리하면서 발생하는 모호함과 반복적인 코드 문제멀티코어 활용 어려움이라는 두 가지 문제를 모두 해결

Java 9

  • 모듈시스템 등장(jigsaw)
  • 컬렉션 기능 추가
  • 스트림 기능 추가
  • ifPresentOrElse 추가 기능
  • 인터페이스
  • 기타

컬렉션 기능 추가

List<String> list = List.of(*"one"*, *"two"*, *"three"*);
Set<String> set = Set.of(*"one"*, *"two"*, *"three"*);
Map<String, String> map = Map.of(*"foo"*, *"one"*, *"bar"*, *"two"*);

스트림 기능 추가

takeWhile, dropWhile, iterate 메서드의 형태로 몇 가지 추가 기능

Stream<String> stream = Stream.iterate(*""*, s -> s + *"s"*)
  .takeWhile(s -> s.length() < 10);

ifPresentOrElse 추가 기능

user.ifPresentOrElse(this::displayAccount, this::displayLogin);

인터페이스

public interface MyInterface {

    private static void myPrivateMethod(){
        System.out.println(*"Yay, I am private!"*);
    }
}

기타

try-with-resources 문 또는 다이아몬드 연산자(<>) 확장, HTTP클라이언트와 같은 몇 가지 다른 개선 사항 존재

Java 10

  • var 키워드
  • 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상
  • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능

var 키워드

// Pre-Java 10
String myName = "Marco";

// With Java 10
var myName = "Marco"
  • 지역 변수 유형 추론
  • var 키워드는 지역 변수 타입 추론을 허용한다.
  • 메서드 내부의 변수에만 적용 가능

Java11

개발자 관점에서 약간 작은 릴리즈

  • Oracle JDK와 OpenJDK 통합
  • Oracle JDK가 구독형 유료 모델로 전환
  • 서드파티 JDK 로의 이전 필요
  • lambda 지역변수 사용법 변경
  • 기타 추가

Strings & Files

몇 가지 새로운 메서드 추가

*"Marco"*.isBlank();
*"Mar\nco"*.lines();
*"Marco  "*.strip();

Path path = Files.writeString(Files.createTempFile(*"helloworld"*, *".txt"*), *"Hi, my name is!"*);
String s = Files.readString(path);

Run Source Files

빌드 없이 실행 가능

람다 매개변수에 대한 지역 변수 유형 추론(var)

람다 표현식에 var 사용 가능

(var firstName, var lastName) -> firstName + lastName

Java12

Java 12에는 몇 가지 새로운 기능과 정리가 포함 되어 있지만

  • 언급할 가치가 있는 것은 유니코드 11 지원과 새로운 스위치 표현식의 preview 뿐

Java 13

여기 에서 전체 기능 목록을 찾을 수 있지만 기본적으로 유니코드 12.1 지원과 두 가지 새롭거나 개선된 preview 기능(향후 변경될 수 있음)이 제공

스위치 표현식(preview)

이제 스위치 표현식이 값을 반환 가능하며 fall-through/break 문제 없이 표현식에 람다 스타일 구문을 사용 가능

switch(status) {
  case SUBSCRIBER:
    *// code block*break;
  case FREE_TRIAL:
    *// code block*break;
  default:
    *// code block*}
boolean result = switch (status) {
    case SUBSCRIBER -> true;
    case FREE_TRIAL -> false;
    default -> throw new IllegalArgumentException(*"something is murky!"*);
};

Multiline Strings (Preview)

String htmlBeforeJava13 = *"<html>\n"* +
              *"    <body>\n"* +
              *"        <p>Hello, world</p>\n"* +
              *"    </body>\n"* +
              *"</html>\n"*;
String htmlWithJava13 = *"""
              <html>
                  <body>
                      <p>Hello, world</p>
                  </body>
              </html>
              """*;

자바 14

  • 스위치 표현시 표준화
  • instanceof 패턴 매칭 (preview)
  • record (data object) 선언 기능 추가 (preview)

스위치 표현(Standard)

버전 12 및 13에서 preview 였던 스위치 표현식 이 이제 표준화 되었다.

int numLetters = switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY                -> 7;
    default      -> {
      String s = day.toString();
      int result = s.length();
      yield result;
    }
};

record(preview)

Java로 많은 상용구를 작성하는 고통을 완화하는 데 도움이 되는 레코드 클래스가 있다.

final class Point {
    public final int x;
    public final int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
    *// state-based implementations of equals, hashCode, toString// nothing else*
record Point(int x, int y) { }

유용한 NullPointerExceptions

author.age = 35;
---
Exception in thread *"main"* java.lang.NullPointerException:
     Cannot assign field *"age"* because *"author"* is null

Pattern Matching For InstanceOf (Preview)

if (obj instanceof String) {
    String s = (String) obj;
    *// use s*}
if (obj instanceof String s) {
    System.out.println(s.contains(*"hello"*));
}

Java 15

  • Text-Blocks / Multiline Strings
  • Records & Pattern Matching(2차 preview, 상단 Java 14 참조)
  • 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)
  • 레코드 (2차 preview, 상단 Java 14 참조)
  • Sealed Classes - Preview
  • Nashorn JavaScript Engine 제거

Text-Blocks / Multiline Strings

Java 13의 실험 기능으로 도입된 여러 줄 문자열은 이제 프로덕션 준비 완료

String text = *"""
                Lorem ipsum dolor sit amet, consectetur adipiscing \
                elit, sed do eiusmod tempor incididunt ut labore \
                et dolore magna aliqua.\
                """*;

Sealed Classes - Preview

  • 상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공된다.
  • 상속 가능한 대상은 상위 클래스 또는 인터페이스 패키지 내에 속해 있어야 한다.
public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

즉, 클래스가 public인 동안 하위 클래스로 허용되는 유일한 Shape 클래스들은 Circle, Rectangle 및 Square 이다.

Java 16

  • Pattern Matching for instanceof
  • Unix-Domain Socket Channels
  • Foreign Linker API - Preview
  • Records & Pattern Matching

Unix-Domain Socket Channels

이제 Unix 도메인 소켓에 연결할 수 있다(macOS 및 Windows(10+)에서도 지원됨).

socket.connect(UnixDomainSocketAddress.of(
        *"/var/run/postgresql/.s.PGSQL.5432"*));

Foreign Linker API - Preview

JNI(Java Native Interface)에 대한 계획된 교체로, 기본 라이브러리에 바인딩할 수 있다(C 생각).

Java 17

Java 17은 Java 11 이후의 새로운 Java LTS(장기 지원) 릴리스

  • Pattern Matching for switch (Preview)
  • Sealed Classes (Finalized)
  • Foreign Function & Memory API (Incubator)
  • Deprecating the Security Manager

Pattern Matching for switch (Preview)

객체를 전달하여 기능을 전환하고 특정 유형을 확인할 수 있다.

public String test(Object obj) {

    return switch(obj) {

    case Integer i -> *"An integer"*;

    case String s -> *"A string"*;

    case Cat c -> *"A Cat"*;

    default -> *"I don't know what it is"*;

    };

}

Sealed Classes (Finalized)

Java 15에서 preview 제공되었던 기능 완료

Foreign Function & Memory API (Incubator)

Java Native Interface(JNI)를 대체한다. 기본 함수를 호출하고 JVM 외부의 메모리에 액세스할 수 있다.

Deprecating the Security Manager

자바 1.0 이후로 보안 관리자가 존재해 왔었지만 현재는 더 이상 사용되지 않으며 향후 버전에서는 제거될 예정

Reference

java 버전별 차이 & 특징

'[개발] 지식 > Java' 카테고리의 다른 글

오버라이딩(Overriding)과 오버로딩(Overloading)  (0) 2023.06.13
객체지향의 설계원칙(SOLID)  (0) 2023.06.12
소수점 Format (DecimalFormat)  (1) 2018.03.06
Comparator  (0) 2017.01.13
Overriding 과 Overloading의 차이  (0) 2016.09.18
<