관리 메뉴

개발자의 스터디 노트

자바 버전별 정리 본문

자바/인스턴트코드

자바 버전별 정리

박개발씨 2022. 4. 14. 00:36

이 포스팅의 출처입니다.

https://www.skyer9.pe.kr/wordpress/?p=287 

 

JAVA 버전별 특징 – 상구리의 기술 블로그

JAVA 버전별 특징 출처1 : https://thatisgood.tistory.com/entry/Java-10-버전-특징 출처2 : https://ggomi.github.io/jdk-version/ JDK 1.0 JDK1.1 1997년 JDBC, RMI, Reflection, JIT, Inner Class JDK 1.2 1998년 자바를 세가지 버전으로 나눴

www.skyer9.pe.kr

https://velog.io/@ljo_0920/java-%EB%B2%84%EC%A0%84%EB%B3%84-%EC%B0%A8%EC%9D%B4-%ED%8A%B9%EC%A7%95

 

java 버전별 차이 & 특징

Java 버전별 특징들을 찾아보면서 좋은 글이 있어 해당 글을 정리한 포스팅입니다.최신 Java 버전은 이제 6개월마다 따른다. 수많은 새로운 버전이 출시됨에 따라 기본적으로 다음과 같은 사용 시

velog.io

 

 

JDK 1.0

 - 1996년 JDK 1.0 발표

 

JDK1.1

 - 1997년

 - JDBC, RMI, Reflection, JIT, Inner Class

 

JDK 1.2

 - 1998년

 - 자바를 세가지 버전으로 나눔(Java SE 1.2, ME 1.2, EE 1.2 발표)

 

JDK 1.3

 - 2000년

 - HotSpot(Sun에서 만든 JIT구현)

 - JNDI

 

JDK 1.4

 - 2002년

 - Regular Expression, Assert keyword, Security 2 version, Non Blocking IO(NIO)

 

Java5

 - 2004년

 - Generics, annotation, auto boxing, enum, vararg, foreach, static imports

 - java.util.concurrent API, scanner class

 

Java6

 - 2006년

 - G1(Garbage First) GC 지원

 

Java7

 - 2011년

 - try-resource, generics 내 타입추론, 숫자에서 underscore 사용가능

 - Type Inference(타입 추론)

// 7 버전 이전
List<String> list = new ArrayList<String>();

//7 버전 이후
List<String> list2 = new ArrayList<>();

 

- String in switch

switch (a) {
   case "jeongmin":
       System.out.println("asd");
       break;
   case "jeongmin2":
       System.out.println("qweqwe");
       break;
   default:
       break;
}

- Catching Multiple Exception Type in Single Catch Block

 

Java8

 - 2014년

 - 오라클 인수 후 첫번째 버전

 - 2개 버전으로 나뉨(Oracle JDK, OpenJDK)

 - Lambda, new Date and Time API(LocalDAteTime,...)

 - interface default method

 - Optional

 - PermGen Area 제거

 

 

Java9

 - 2017년

 - 모듈시스템 등장(jigsaw)

 

Java10

 - 2018.03

 - var 키워드

 - 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상

 - JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능

 

Java11

 - 2018.09

 - OracleJDK 와 OpenJDK 통합

 - OracleJDK가 구독형 유료 모델로 전환

 - 서드파티 JDK로의 이전 필요

 - lambda 지역변수 사용법 변경

(var x, var y) -> x.process(y)  =>  (x, y) -> x.process(y)

 

Java12

 - 2019.03

 - switch문 확장

 

Java13

 - 스위치 표현식(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>
              """*;

 

 

Java14

- 스위치 표현식 표준화

버전 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;
    }
};

 - instanceof 패턴 매칭(preview)

 - record(data object) 선언 기능 추가( preview)

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

데이터,(잠재적으로) getter/setters, 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)

이전에는 다음과 같이 instanceof 내부에서 객체를 캐스팅 필요

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

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

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

 - Records & Pattern Matching(2차 preview, 상단 Java14 참조)

 - 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가(ZGC)

 - 레코드 (2차 preview, 상단 Java14 참조)

 - Sealed Classes - Preview

상속 가능한 클래스를 지정할 수 있는 봉인 클래스가 제공된다.

상속 가능한 대상은 상위 클래스 또는 인터페이스 패키지 내에 속해 있어야 한다.

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

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

 

 - Nashorn JavaScript Engine 제거

 

 

Java16

 - Pattern Matching for instanceof

 - 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

 

 

Java17

- Java17은 Java11 이후의 새로운 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"*;

    };

}

 - Sealed Classes(Finalized)

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

 - Foreign Function & Memory API(Incubator)

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

 - Deprecating the Security Manager

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