개발자의 길

Java history(~21) 및 버전 별 차이 & 특징 본문

4. JAVA

Java history(~21) 및 버전 별 차이 & 특징

자르르 2023. 10. 26. 15:35


어떤 자바 버전을 사용해야 할까?

최신 Java 버전은 이제 6개월마다 따른다.

수많은 새로운 버전이 출시됨에 따라 기본적으로 다음과 같은 사용 시나리오가 존재

  • 기업의 기존 프로젝트에서는 Java 8을 사용해야 하는 경우가 많음
  • 일부 레거시 프로젝트는 Java 1.5(2004년 출시) 또는 1.6(2006년 출시)에서 중단되기도 함
  • 최신 IDE, 프레임워크 및 빌드 도구를 사용하고 그린 필드 프로젝트를 시작하는 경우 Java 11(LTS) 또는 최신 Java 17 LTS를 망설임 없이 사용할 수 있다.
  • 안드로이드 개발의 특별한 분야가 있는데, 자바 버전은 기본적으로 자바 7에 고정되어 있고, 특정한 자바 8 기능들을 이용할 수 있다. 또는 코틀린 프로그래밍 언어를 사용하는 것으로 전환

 

특정 자바 버전을 학습해야 할까?

12, 17와 같은 특정 Java 버전만을 "학습"할 필요가 없다.

Python 2에서 3과 같이 릴리스 사이에 심각한 문제가 있는 것과 달리 자바는 하위 호환성이 매우 높기 때문

  • 즉, Java 5 또는 8 프로그램이 Java 8-17 가상 머신에서 실행되도록 보장된다.
  • 이걸 backward compatible (하위 호환성) 이라 한다.

반대로 java 8 JVM에서는 사용할 수 없는 java 17 기능을 의존한다면 컴파일 되지 않는다.

  • 대부분 java.lang.UnsupportedClassVersionError 발생

그러므로 오히려 Java 8의 내용들로 토대를 쌓고 Java 9-17에 추가된 기능에 대해 알아보고 언제든지 사용할 수 있다.

 

자바 Distribution

JDK 다운로드를 제공하는 다양한 사이트가 있으며 "누가 어떤 라이선스로 무엇을 제공하는지"가 불분명하다.

OpenJDK 프로젝트

Java 소스 코드(RE/JDK의 소스 코드)의 경우 OpenJDK 프로젝트 사이트에 존재하는 유일한 소스 코드

그러나 이것은 소스 코드일 뿐 배포 가능한 빌드가 아니다.

  • 이론적으로, 해당 소스 코드로 빌드를 만들 수 있다
  • 예를 들어 MarcoJDK라고 부르며 배포하기 시작 가능
  • 하지만 합법적으로 자바 SE 호환이라고 부를 수 있는 우리의 배포판은 인증이 부족할 것

이러한 이유로 실제로 이러한 빌드를 만들고 인증을 받은 후 배포하는 벤더가 많지 않다.

OpenJDK 빌드(오라클) 및 OracleJDK 빌드

자바를 소스에서 빌드하는 벤더 중 하나가 오라클이다.

Oracle JDK와 OpenJDK의 차이점

  • Oracle JDK는 상용(유료)이지만, 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 사용량과 메모리 사용량이 적고, 응답시간이 높다.
  • Oracel Java 17 부터는 Oracle의 무료 이용약관 라이센스를 도입하여, OracleJDK를 다시 무료로 만들었습니다.
 

계영TNI 지식포털

소프트웨어 라이선스 컨설팅과 랜섬웨어 대응

gytni.com

Java 8 이전 OpenJDK 빌드와 OracleJDK 빌드 사이에는 실제 소스 차이가 존재했는데, 최신의 두 버전은 본질적으로 동일하며 약간의 차이만 존재한다.

 

Adoptium (formerly AdoptOpenJDK)

2017년에 자바 유저 그룹 멤버, 개발자, 벤더(아마존, 마이크로소프트, 피보탈, 레드햇 등)로 구성된 그룹이 AdoptOpenJDK라는 커뮤니티를 시작

  • 참고: 2021년 8월 현재, AdoptOpenJDK 프로젝트는 새로운 집으로 옮겨졌고 지금은 Eclipse Adoptium 프로젝트로 불린다.

또한 보다 긴 가용성/업데이트를 갖춘 강력한 무료 OpenJDK 빌드를 제공하며 다음과 같은 두 가지 Java 가상 머신도 선택 가능

Java를 설치하려는 경우 권장된다.

Azul Zulu, Amazon Corretto, SAPMachine

  • 그 외에 주목할만한 distribution

 

자바 기능 8-21

이 가이드의 시작 부분에서 언급했듯이 기본적으로 모든 Java 8 언어 기능은 Java 20에서도 작동합니다. 그 사이의 다른 모든 Java 버전에서도 마찬가지입니다.

이는 Java 8의 모든 언어 기능이 매우 우수한 Java 기본 지식으로 사용되며 그 밖의 모든 것(Java 9-20)은 해당 기준 위에 추가되는 거의 추가 기능임을 의미합니다.

특정 버전이 제공하는 기능에 대한 간략한 개요는 다음과 같습니다.

- 자바 8 -

Java 8은 대규모 릴리스였으며 Oracle 웹 사이트 에서 모든 기능 목록을 찾을 수 있습니다 . 하지만 여기서 언급하고 싶은 두 가지 주요 기능 세트가 있습니다.

Lamda

Java 8 이전에는 새로운 Runnable을 인스턴스화할 때마다 다음과 같이 익명의 내부 클래스를 작성해야 했습니다.

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

람다를 사용하면 동일한 코드는 다음과 같습니다.

Runnable runnable = () -> System.out.println("Hello world two!");

또한 메서드 참조, 반복 주석, 인터페이스용 기본 메서드 및 기타 몇 가지 언어 기능도 제공됩니다.

Collection & Stream

Java 8에서는 Stream API라고도 알려진 컬렉션에 대한 기능적 스타일 작업도 제공됩니다. 간단한 예:

List<String> list = Arrays.asList("franz", "ferdinand", "fiel", "vom", "pferd");

이제 Java 8 이전에는 해당 목록으로 작업을 수행하려면 기본적으로 for-loop를 작성해야 했습니다.

Streams API를 사용하면 다음을 수행할 수 있습니다.

list.stream()
    .filter(name -> name.startsWith("f"))
    .map(String::toUpperCase)
    .sorted()
    .forEach(System.out::println);

Java 8을 더 많이 연습하고 싶다면

분명히 이 가이드의 범위에서는 Java 8에 새로 추가된 각각의 Stream, Lambda 또는 Optional 메서드에 대한 간략한 개요만 제공할 수 있습니다.

- 자바 9 -

Java 9은 또한 몇 가지 추가 사항을 포함하여 상당히 큰 릴리스였습니다.

Collection

컬렉션에는 목록, 세트 및 맵을 쉽게 구성할 수 있는 몇 가지 새로운 도우미 메서드가 있습니다.

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");

Stream

Streams에는 takeWhile,dropWhile,iterate 메소드 형태로 몇 가지 추가 기능이 있습니다.

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

Optional

Optional에는 ifPresentOrElse 메소드가 크게 누락되었습니다.

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

Interface

인터페이스에는 개인 메소드가 있습니다.

public interface MyInterface {

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

기타 언어 기능

향상된 리소스 사용 설명이나 다이아몬드 연산자 확장과 같은 몇 가지 다른 개선 사항도 있습니다.

JShell

마지막으로 Java에는 간단한 명령을 시도하고 즉각적인 결과를 얻을 수 있는 셸이 있습니다.

% jshell
|  Welcome to JShell -- Version 9
|  For an introduction type: /help intro

jshell> int x = 10
x ==> 10

HTTP클라이언트

Java 9는 새로운 HttpClient의 초기 미리보기 버전을 가져왔습니다. 그때까지 Java의 내장 Http 지원은 다소 낮은 수준이었고 Apache HttpClient 또는 OkHttp(훌륭한 라이브러리입니다. btw!)와 같은 타사 라이브러리를 사용해야 했습니다.

Java 9를 통해 Java는 자체적인 최신 클라이언트를 갖게 되었습니다. 단, 미리 보기 모드이므로 이후 Java 버전에서 변경될 수 있습니다.

Project Jigsaw: Java 모듈 및 다중 릴리스 Jar 파일

Java 9에는 오래된 OSGI 사양과 다소 유사한 Jigsaw 모듈 시스템이 있습니다 . Jigsaw에 대해 자세히 설명하는 것은 이 가이드의 범위에 속하지 않지만, 더 자세히 알아보려면 이전 링크를 살펴보세요.

다중 릴리스 .jar 파일을 사용하면 다양한 JVM 버전에 대한 다양한 클래스가 포함된 하나의 .jar 파일을 가질 수 있습니다. 따라서 프로그램은 예를 들어 Java 8과 Java 10에서 실행될 때 다르게 동작하거나 서로 다른 클래스를 사용할 수 있습니다.

- 자바 10 -

가비지 컬렉션 등과 같은 Java 10에 몇 가지 변경 사항이 존재

개발자로서 보게 될 유일한 실제 변경 사항은 로컬 변수 유형 추론이라고도 하는 "var" 키워드의 도입

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

지역 변수 유형 추론: var-keyword

// Pre-Java 10

String myName = "Marco";

// With Java 10

var myName = "Marco"

Javascript와 같은 느낌이 들지 않나요? 하지만 이는 여전히 강력한 형식이며 메서드 내부의 변수에만 적용됩니다 ( 다시 지적해 주신 dpash 에게 감사드립니다).

- 자바 11 -

Java 11은 개발자 관점에서 보면 다소 작은 릴리스였습니다.

  • 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

 

Java 10부터는 먼저 컴파일하지 않고도 Java 소스 파일을 실행할 수 있습니다. 스크립팅을 향한 한 단계.

ubuntu@DESKTOP-168M0IF:~$ java MyScript.java

 

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

 

헤더에 모든 내용이 나와 있습니다.

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

 

Http클라이언트

미리보기가 아닌 최종 버전의 Java 9의 HttpClient입니다.

다른 것들

비행 기록 장치, 무작동 가비지 수집기, Nashorn-Javascript-Engine 지원 중단 등

 

- 자바 12 -

Java 12에는 몇 가지 새로운 기능과 정리 기능이 있지만 여기서 언급할 가치가 있는 유일한 기능은 유니코드 11 지원과 다음 섹션에서 다룰 새로운 스위치 표현식의 미리 보기입니다.

 

- 자바 13 -

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

스위치 표현식(preview)

이제 스위치 표현식이 값을 반환할 수 있습니다. 그리고 오류/중단 문제 없이 표현식에 람다 스타일 구문을 사용할 수 있습니다.

이전 스위치 문은 다음과 같았습니다.

switch(status) {
  case SUBSCRIBER:
    // code block
    break;
  case FREE_TRIAL:
    // code block
    break;
  default:
    // code block
}

반면 Java 13에서는 스위치 문이 다음과 같을 수 있습니다.

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

 

Multiline Strings (Preview)

 

마침내 Java에서 이 작업을 수행 할 수 있습니다 .

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 -

스위치 표현(Standard)

버전 12 및 13에서 미리 보기로 제공되었던 스위치 표현식이 이제 표준화되었습니다.

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로 많은 상용구를 작성하는 데 따른 고통을 완화하는 데 도움이 되는 레코드 클래스가 있습니다.

데이터, (잠재적으로) getter/setter, equals/hashcode, toString만 포함하는 Java 14 이전 클래스를 살펴보세요.

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

마지막으로 NullPointerExceptions는 어떤 변수가 null인지 정확하게 설명합니다 .

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"));
}

 

Packaging Tool (Incubator)

필요한 모든 종속성을 포함하여 Java 애플리케이션을 플랫폼별 패키지로 패키징할 수 있는 인큐베이팅 jpackage 도구가 있습니다 .

  • Linux: deb and rpm
  • macOS: pkg and dmg
  • Windows: msi and exe

Garbage Collectors

CMS(Concurrent Mark Sweep) 가비지 수집기가 제거되고 실험적인 Z 가비지 수집기가 추가되었습니다.

 

- 자바 15 -

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 이다.

Records & Pattern Matching

RecordsJava 14의 및 기능 Pattern Matching(위 참조)은 아직 미리 보기 상태이며 아직 완성되지 않았습니다.

Nashorn JavaScript Engine

Java 11에서 더 이상 사용되지 않는 Nashorn Javascript 엔진은 이제 JDK 15에서 마침내 제거되었습니다.

 

ZGC: Production Ready

Z Garbage Collector는 더 이상 실험용으로 표시되지 않습니다. 이제 생산 준비가 완료되었습니다.

 

- 자바 16 -

Pattern Matching for instanceof

Instead of:

if (obj instanceof String) {
    String s = (String) obj;
    // e.g. s.substring(1)
}

이제 다음을 수행할 수 있습니다.

if (obj instanceof String s) {
    // Let pattern matching do the work!
    // ... s.substring(1)
}

 

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를 생각해 보세요)에 바인딩할 수 있습니다.

 

Records & Pattern Matching

두 기능 모두 이제 프로덕션 준비가 완료되었으며 in preview더 이상 표시되지 않습니다.

 

Sealed Classes

Sealed Classes (Java 15부터, 위 참조)는 아직 미리 보기 상태입니다.

 

- 자바 17 -

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

 

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";

    };

}

이제 Objects스위치 기능을 전달하고 특정 유형을 확인할 수 있습니다.

 

Sealed Classes (Finalized)

Java 15에서 미리보기로 제공되었던 기능이 이제 마무리되었습니다.

요약: 클래스를 하위 클래스로 분류할 수 있는 사람이 누구인지 더 자세히 알고 싶다면 이제 이 sealed기능을 사용하세요.

public abstract sealed class Shape
    permits Circle, Rectangle, Square {...}

 

 

Foreign Function & Memory API (Incubator)

Java Native Interface(JNI)를 대체한다. 기본 함수를 호출하고 JVM 외부의 메모리에 액세스할 수 있다. 지금은 C가 C++, 포트란과 같은 추가 언어 지원 계획을 가지고 있다고 생각

 

Deprecating the Security Manager

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

 

- 자바 18 -

기본적으로 UTF-8

예를 들어 명시적인 문자 종료를 지정하지 않고 파일을 읽으려고 하면 이전 Java 버전(예: Linux 및 macOS에서는 UTF-8, Windows에서는 Windows-1252)에서 운영 체제 인코딩이 사용되었습니다. Java 18에서는 기본적으로 UTF-8로 변경되었습니다.

 

Simple Web Server

이제 Java 18에는 다음과 같이 시작할 수 있는 기본적인 HTTP 서버가 제공됩니다.

jwebserver

여기에서 해당 기능에 대해 자세히 알아보세요 .

 

Other Not-So-Exciting-Stuff / Incubating Features

전체 목록과 개요를 보려면 이 문서를 확인하세요 .

 

- 자바 19 -

Virtual ThreadsJava 19에는 및 새로운 기능과 Foreign Function & Memory API및 및 같은 Structured Concurrency몇 가지 흥미로운 기능이 추가되었습니다 Vector API. 그러나 모두 preview모드이므로 다음 릴리스에서 변경될 수 있습니다.

이러한 기능과 앞으로 제공될 기능에 대해 알아보려면 이 문서를 확인하세요 .

 

- 자바 20 -

일부 작은 기능 외에도 Java 20은 이전에 도입된 preview 기능(범위 값, 레코드 패턴, 스위치용 패턴 일치, 외부 함수 및 메모리 API, 가상 스레드 및 구조적 동시성)을 주로 반복했습니다. 모두 작업이 진행 중입니다. 즉, 아직 확정되지 않았습니다.

이러한 기능과 앞으로 제공될 기능에 대해 알아보려면 이 문서를 확인하세요 

- 자바 21 -

 - 새로운 LTS 버전

 - Spring boot 3.2 버전 부터 지원

 

Virtual Threads가 표준화 되었음

Sequenced Collections

  • 정의된 만남 순서로 컬렉션을 나타내는 새로운 인터페이스를 도입
  • 이러한 각 컬렉션에는 잘 정의된 첫 번째 요소, 두 번째 요소 등을 거쳐 마지막 요소까지 포함
  • 또한 첫 번째 요소와 마지막 요소에 액세스하고 해당 요소를 역순으로 처리하기 위한 통일된 API를 제공

JDK 21 이전 : 컬렉션 별 마지막 요소 구하는 방법

Sequenced Collections 사용 시

interface SequencedCollection<E> extends Collection<E> {
    // new method
    SequencedCollection<E> reversed();

    // methods promoted from Deque
    void addFirst(E);
    void addLast(E);
    E getFirst();
    E getLast();
    E removeFirst();
    E removeLast();
}

Unnamed Patterns and Variables (Preview)

  • 구성 요소의 이름이나 유형을 명시하지 않고 이름 없는 패턴 및 변수로, 밑줄 문자(_)로 표시

JDK 21 이전

int total = 0;
for (Order order : orders) {
		// 사실상 사용되지 않는 order
    if (total < LIMIT) { 
        ... 
				total++ 
				...
    }
}

JDK 21 ~

int total = 0;
for (Order _ : orders) {
    if (total < LIMIT) { 
        ... 
				total++ 
				...
    }
}

 

Unnamed Classes and Instance Main Methods (Preview)

학생들이 대규모 프로그램용으로 설계된 언어 기능을 이해할 필요 없이
첫 번째 프로그램을 작성할 수 있도록 Java 언어를 발전시키기 위함.

 

JDK 21 이전

  • 처음 시작하는 사용자들에게 public 접근 제한, static , args 등의 많은 지식을 요구한다.
public class HelloWorld { 
    public static void main(String[] args) { 
        System.out.println("Hello, World!");
    }
}

JDK 21 ~

void main() {
    System.out.println("Hello, World!");
}

 

Record Pattern

 

레코드(Record)에 타입 패턴을 함께 적용하여 레코드의 값을 손쉽게 처리할 수 있도록 도와준다.

자바 16에서는 instance of 연산자에 타입 패턴을 적용하여 패턴 매칭을 개선시켰다. 타입 패턴 덕분에 instance of 하위 블록에서는 직접적으로 타입 캐스팅할 필요가 없어졌다.

// Prior to Java 16
if (obj instanceof String) {
    String s = (String)obj;
    ... use s ...
}

// As of Java 16
if (obj instanceof String s) {
    ... use s ...
}

 

 

이러한 바탕은 자바 언어가 보다 데이터 중심적인 프로그래밍 스타일로 나아가기 위함인데, 자바 21부터는 레코드 타입에 대해 보다 개선된 방법으로 사용 가능해질 예정이다.

기존에는 레코드 클래스에 instance of 연산자를 적용하면 다음과 같이 사용했었다.

record Point(int x, int y) {}

static void printSum(Object obj) {
    if (obj instanceof Point p) {
        int x = p.x();
        int y = p.y();
        System.out.println(x+y);
    }
}

 

 

하지만 자바 21부터는 다음과 같은 방식으로 사용 가능해진다. 이를 통해 obj가 Point의 인스턴스인지 여부를 테스트할 뿐만 아니라 개발자를 대신해 접근자 메소드를 호출하여 직접 변수들에 접근할 수 있게 된다. 이렇듯 새롭게 도입되는 레코드 패턴(Record Pattern)은 레코드 객체를 분해해주는 기능이라고 볼 수 있다.

// As of Java 21
static void printSum(Object obj) {
    if (obj instanceof Point(int x, int y)) {
        System.out.println(x+y);
    }
}

 

이 외에도 많은 기능이 추가 되었다.

추가 적인 건 문서로 확인이 가능 하다

 

에휴.. 언제 이걸 다 익혀..

 

참고 자료 :

- https://www.marcobehler.com/guides/a-guide-to-java-versions-and-features

 

Java Versions and Features

You can use this guide to get practical information on how to find and install the latest Java, understand the differences between Java distributions (Adoptium, AdoptOpenJdk, Temurin, OpenJDK, OracleJDK etc.), as well as get an overview of Java language fe

www.marcobehler.com

- https://openjdk.org/projects/jdk/21/

 

JDK 21

JDK 21 This release is the Reference Implementation of version 21 of the Java SE Platform, as specified by JSR 396 in the Java Community Process. JDK 21 reached General Availability on 19 September 2023. Production-ready binaries under the GPL are avai

openjdk.org

- https://velog.io/@dongvelop/JDK-21%EC%9D%B4-%EC%B6%9C%EC%8B%9C%EB%90%98%EC%97%88%EB%8B%A4.-%EC%B5%9C%EC%8B%A0-%EB%AC%B8%EB%B2%95%EC%9D%80-%EC%82%B4%ED%8E%B4%EB%B4%90%EC%95%BC%EC%A7%80

 

JDK 21이 출시되었다. 최신 문법 보고 가요

Java 1.5부터 21 최신 문법까지 Virtual Threads, Structured Concurrency, Unnamed Patterns 등등 문법 총정리

velog.io

 - https://mangkyu.tistory.com/308

 

[Java] Java 21에 추가될 새로운 기능들(Java 21 Features)

자바 21이 2023년 9월 19일에 정식으로 출시되었습니다. 자바 17을 이을 차기 LTS 버전인 만큼 중요하기 때문에, 새롭게 추가되는 기능들에 대해 자세하 살펴보도록 하겠습니다. 1. Java 21의 등장 [ Java

mangkyu.tistory.com

 



이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.
공유하기 링크
Comments