Programming Languages/Java

자바 버전별 역사 및 특징

DeJa 2022. 1. 12. 20:04
728x90

자바 버전별 역사 및 특징

  • JDK 1.0a2
    • 1995년 5월 23일 발표. 자바 언어 자체가 정식으로 발표된 날
    • 이때의 명칭은 Oak
  • JDK 1.0
    • 1996년 1월 23일 발표
    • 1.0.2 버전에서 이름이 Java 로 변경
  • JDK 1.1
    • 1997년 2월 19일 발표
    • Inner Class, JavaBeans, RMI, Reflection, Calendar 유니코드 지원 등이 추가되었다.
    • What is Java Beans
      • 자바로 작성된 소프트웨어 컴포넌트를 지칭
      • Beans 규약
        • 기본 생성자가 반드시 존재해야 한다.
        • 모든 속성은 비공개이다.
        • 속성에 접근하고 꺼내올 수 있는 getter, setter 메서드를 구성한다.
        • Serializable 을 구현한다.
    • What is RMI(Remote Method Invocation)
      • 분산 애플리케이션을 구축하는데 사용된다.
      • 한 시스템(JVM)에 상주하는 객체가 다른 JVM에서 실행 중인 객체에 액세스/호출할 수 있도록 하는 메커니즘이다.
      • java.rmi 패키지에 제공된다.
  • J2SE 1.2
    • 1998년 12월 8일 발표
    • Swing GUI, JIT, Collection Framework 등이 추가 되었다.
  • J2SE 1.3
    • HotSpot JVM, JNDI, JPDA, JavaSound 등이 추가 되었다.
  • J2SE 1.4
    • 2002년 2월 6일 발표
    • assert, 정규표현식, XML API 등이 추가 되었다.
  • J2SE 1.5
    • Generics, Annotation, AutoBoxing/UnBoxing, Enumeration, 가변 길이 파라미터, static import, Concurrency API 등이 추가 되었다.
    • JDK 1.5 이전에서는 여러 타입을 사용하는 대부분의 클래스나 메소드에서 인수나 반환값으로 Object 타입을 사용했다.
// 1.5 이전, 컬렉션에 기본 타입을 삽입하는 코드
List list = new ArrayList(10);
list.add(new Integer(10)); // AutoBoxing, UnBoxing 지원 X
// 1.5 이후, 컬렉션에 기본 타입을 삽입하는 코드
List<Integer> list = new ArrayList<>();
list.add(10);
  • Generics 가 등장함으로써, 잘못된 타입이 사용될 경우 컴파일 과정에서 제거할 수 있게 되었다. 또한 불필요한 타입 변환이 필요 없다.
  • Generic 사용 이전
List list = new ArrayList();
list.add("JungHo");
String name = (String) list.get(0);
  • Generic 사용 이후
List<String> list = new ArrayList<>();
list.add("JungHo");
String name = list.get(0);
  • Java SE 6
    • 2004년 9월 30일 발표
    • 이때 부터 표기가 J2SE 에서 Java SE 로 변경 되었다.
    • Java Compiler API, Pluggable Annotation 등이 추가 되었다.
    • Java Compiler API
    • Pluggable Annotation
      • Lombok 등에서 사용되고 있다.
      • 쉽게 말해 Annotation Processor 를 생각하면 된다.
        • 즉, 컴파일 타임에 코드 삽입을 구현한다.
  • Java SE 7
    • 2011년 7월 7일에 발표.
      • 7버전이라 일부러 7월 7일에 한것같은 느낌임...
    • Java SE 7의 일반 지원은 2015년 4월에 종료 되었고, 오라클을 통한 연장 지원은 2022년 7월에 종료 예정이다.
    • switch 문에서 String 사용, try-catch-resources, 이진수 리터럴, 숫자 리터럴에 _ 지원, 새로운 File NIO 라이브러리 등이 추가되었다.
  • Java SE 8
  • Java SE 9
    • 2017년 9월 21일 발표
    • 일반 지원은 2018년 3월에 종료되었다.
    • Java 를 인터프리터 언어 셸처럼 사용할 수 있는 JShell 이 추가되었다.
    • Java 바이트코드를 기계어로 미리 번역하는 선행 컴파일(Ahead-Of-Time Compilation) 역시 실험 기능으로 추가되었다.
  • Java SE 10
    • 2018년 3월 20일 발표
    • 일반 지원은 2018년 9월에 종료되었다.
    • var 키워드를 이용한 지역 변수 타입 추론
    • 병렬 처리 가비지 컬렉션, 개별 쓰레드로 분리된 Stop-The-World 등이 추가 되었다.
      • 기존에는 Stop-The-World 가 발생하면 GC 를 실행하는 쓰레드를 제외한 나머지 쓰레드는 모두 작업을 멈춘다. GC 작업을 완료한 이후에야 중단했던 작업을 다시 시작한다. 근데 이게 개별 쓰레드로 분리되어서 Stop-The-World 시간이 개선된것 같다.
    • JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당할 수 있게 되었다.
    • JDK에서 루트 인증 기관(CA) 인증서의 기본 세트를 제공하게 되었다.
    • Enhanced for Loop 를 위한 바이트코드 생성
      • Enhanced for Loop 에 대한 바이트코드 생성이 개선되어 해당 루프에 대한 컴파일 접근 방식이 개선되었다.
  • Java SE 11
    • 2018년 9월 25일 발표.
    • hotspot/jvmti 기능 등이 추가되었다.
      • JVMTI(JEP 331) 를 통해 액세스할 수 있는 낮은 오버헤드 샘플링 Java 힙 할당 방법을 제공한다.
    • 이클립스 재단으로 넘어간 Java EE가 JDK 에서 삭제되고, JavaFX 도 JDK 에서 분리되어 별도의 모듈로 제공된다.
    • 가장 커다란 변화는 바로 라이선스 부분이다. Java SE 11 부터 Oracle JDK 의 독점 기능이 오픈 소스 버전인 OpenJDK 에 이식된다. 이는 다시 말해 Oracle JDK 와 OpenJDK가 완전히 동일해진다는 뜻이다.
    • 2019년 1월부터 오라클이 제공하는 모든 Oracle JDK는 유료화되며, 구독권을 구입하지 않으면 Oracle JDK에 접근 자체가 금지된다. 따라서, OpenJDK 를 기반으로 한 다른 서드파티 JDK 가 대안으로 떠오르고 있다.
      • Ex. Zulu JDK, AdoptOpenJDK 등이 있다.
  • Java SE 12
    • 2019년 3월 19일 발표.
    • 특징 중 하나로 문법적으로 Switch 문을 확장한 것이 있다.
    • 예전 Switch
switch (day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(8);
        break;
    case WEDNESDAY:
        System.out.println(9);
        break;
}
  • 개선된 Switch
switch (day) {
    case MONDAY, FRIDAY, SUNDAY -> System.out.println(6);
    case TUESDAY                -> System.out.println(7);
    case THURSDAY, SATURDAY     -> System.out.println(8);
    case WEDNESDAY              -> System.out.println(9);
}
  • Java SE 13
    • 2019년 9월 17일 발표.
    • yield 라는 예약어가 추가되었다.
  • Java SE 14
    • 2020년 3월 18일 공개.
    • record 라는 데이터 오브젝트 선언 기능이 추가되었다.
      • record 클래스는 final 클래스라 상속할 수 없다.
      • 각 필드는 private final 로 정의된다.
    • record 사용 방법
  • Java SE 15
  • Java SE 16
    • OpenJDK 의 버전 관리가 Mercurial 이었으나, 이제 Git 으로 바뀐다.
    • 이제 OpenJDK 소스를 GitHub 에서 볼 수 있다
  • Java SE 17

References

728x90