JAVA 1.0a2 - 1995년

  • 최초 버전
  • Oak 라는 이름으로 불림

 

JAVA 1.0 - 1996년

  • 안정화 작업을 거친 1.0.2 버전에서 Java로 이름 변경.

 

JAVA 1.2 (Playground) - 1998년

  • 해당 버젼부터 코드명 등장
  • 플렛폼을 J2SE, J2EE, J2ME로 구성

 

JAVA 1.3 (Kestrel) - 2000년

  • Java XML API, JNDI 등이 추가됨

 

JAVA 1.4 (Merlin) - 2002년

  • IPv6 지원
  • 정규표현식 지원
  • 논블로킹 IO : IO를 비차단으로 최적화하여 실행 중인 애플리케이션 속도 향상.
  • 이미지처리 API : 컴포넌트 개발자가 JAVA코드로 이미지를 조작할 수 있음.
  • JAVA 커피잔 로고는 2003년 (릴리즈 버젼 1.4 와 5.0 사이에) 자바 컨퍼런스에서 처음 사용함.

 

JAVA 5 (Tiger) - 2004년

  • 처음에는 1.5로 명명되었으나 성숙도, 안정성, 확장성 및 보안이 크게 향상된 새로운 기능이 포함된 주요 릴리스였기 때문에 5.0으로 공개함. (이때부터 앞의 1.이 없어짐.)
  • Generics : 외부에서 형태를 정해주는 제너릭. ClassCastException을 컴파일시 검증 가능.
  • 메타데이터라고도 하는 어노테이션은 메타데이터 인식 유틸리티가 클래스와 메서드를 처리할 수 있도록 태그를 지정하는 데 사용(즉, 구성 요소를 다른 구성 요소가 인식하고 특정 작업을 수행하는 것으로 레이블이 지정됨).
  • Auto Boxing/Unboxing : 오토 박싱/언박싱 기능을 통해 원시타입 객체를 래퍼 클래스로 자동 변환 해줌.
  • Enumeration : 열거형(enum) 기능 추가됨
  • 변수는 한 유형의 임의 개수의 매개 변수를 지원하는 메서드에 대한 약어 제공. 메서드의 마지막 매개 변수는 형식 이름과 세 개의 점(예: String…)을 사용하여 선언되며 이는 해당 형식의 임의의 수의 인수를 제공하고 배열에 배치할 수 있음을 의미.
  • for each문 기능 향상 : 컬렉션 및 배열에서도 사용 가능.
  • 멀티쓰레드 상의 시멘틱스 향상
  • Static imports
  • RMI(Remote Method Invocation, 원격 메소드 호출), Swing, 동시성 유틸리티(Processes and Threads) 및 Scanner 클래스 개선
  • Java 5는 Apple Mac OS X 10.4에서 처음 사용할 수 있으며 Apple Mac OS X 10.5에 설치된 기본 버전.

 

JAVA 6 (Mustang) - 2006년

  • 가비지 컬렉터 G1(Garbage First) 테스트용으로 추가.
  • 2010년 1월 오라클이 Sun Microsystems를 인수하게 됨에 따라 Sun Microsystems에서 출시한 마지막 주요 릴리스 버전.
  • 핵심 플랫폼의 성능 향상(애플리케이션 실행 속도 향상. 실행에 필요한 메모리 또는 CPU 감소).
  • 향상된 웹 서비스 지원(웹 응용프로그램 개발에 필요한 최적화된 구성요소).
  • JDBC 4.0(데이터베이스를 사용한 애플리케이션 개발에 필요한 최적화된 구성 요소).
  • Java 컴파일러 API(코드에서 코드를 컴파일하는 데 사용되는 구성 요소를 호출할 수 있습니다.)
  • API에서의 SwingWorker 통합, 테이블 정렬 및 필터링, Swing 이중 버퍼링(회색 영역 효과 제거)과 같은 전반적으로 데스크톱 애플리케이션을 위한 인터페이스를 만드는 데 사용되는 구성 요소의 개선.
  • 2008년 12월 JavaFX 1.0 SDK 출시. JavaFX는 모든 플랫폼의 그래픽 사용자 인터페이스를 만드는 데 적합. 초기 버전은 스크립트 언어. 2008년까지 자바에서는 사용자 인터페이스를 만드는 두 가지 방법 존재했음(AWT, Swing)

 

JAVA 7 (Dolphin) - 2011년

  • 동적 바이트 코드(기본적으로 Java 코드는 Python, Ruby, Perl, Javascript 및 Groovy와 같은 비 자바 언어로 구현된 코드를 사용할 수 있음)를 사용하여 dynamic languages를 JVM에서 지원.
  • 압축된 64비트 포인터(JVM의 내부 최적화로 메모리 사용량 감소)
  • 프로젝트 “Coin” 하에 그룹화된 작은 변경 사항들:
    • Switch-case 문에서 문자열 사용 가능
    • Try-catch 문에서 자동 리소스 관리
    • 제네릭의 개선된 유형 추론
    • 이진 정수 리터럴: 정수 숫자는 0b(또는 0B) 형식과 하나 이상의 이진 숫자(0 또는 1)를 사용하여 이진 숫자로 직접 나타낼 수 있음
    • 다중 예외처리 개선
  • 동시성 향상
  • 새 I/O 라이브러리(파일에서 데이터 읽기/쓰기에 추가된 새 클래스)
  • Timsort 알고리즘은 성능이 더 좋기 때문에 병합 정렬 대신 객체의 컬렉션과 배열을 정렬하기 위해 도입됨. (Merge Sort(병합 정렬) + Insertion Sort(삽입 정렬))

Java 7을 시작으로 Java SE Platform Edition의 오픈 소스 레퍼런스 구현체인 OpenJDK가 탄생.

 

JAVA 8 (Spider) - 2014년

  • LTS버젼. 2030년 12월까지.
  • 오라클 인수 후 첫 번째 버전
  • 람다 표현식 지원(함수형 프로그래밍 특징)
  • 인터페이스에서 default 메서드 지원 (인터페이스에 함수 구현 내용까지 포함 가능)
  • 새로운 날짜 및 시간 API
  • 스트림을 사용하여 병렬 처리를 수행하는 새로운 방법 추가
  • JavaScript(Nashorn 프로젝트)와의 통합 개선됨.
  • GC 프로세스 개선
  • Permanent Generation이 Metaspace로 대체됨
    • Permanent Generation
      • Permanent Generation은 Class 혹은 Method Code가 저장되는 영역
      • PermGen은 Heap 영역에 속함
      • Default로 제한된 크기를 가지고 있음
    • Metaspace
      • Metaspace는 Java 클래스 로더가 현재까지 로드한 Class들의 메타데이터가 저장되는 공간
      • JVM에 의해 관리되는 Heap 영역이 아니라 OS 레벨에서 관리되는 Native 메모리 영역에 위치
      • Default로 제한된 크기를 가지고 있지 않고, 필요한 만큼 늘어남

Java 8부터는 상표법상의 문제를 피하기 위해 코드네임 삭제됨. 대신 메이저, 마이너 및 보안 업데이트 릴리스를 쉽게 구분하는 시맨틱 버전이 채택됨.

$Major.$minor.$SECURITY

터미널에서 Java 버전을 실행할 때(Java 8이 설치된 경우) 아래와 유사한 로그가 표시됩니다.

	$ java -version
	java version "1.8.0_162"
	JavaTM SE Runtime Environment build 1.8.0_162-b12
	Java HotSpotTM 64-Bit Server VM build 25.162-b12, mixed mode

로그 버전 번호의 의미 :

  • 1은 Java SE Platform Specification의 새 버전에 지정된 대로 중요한 새 기능이 포함된 주요 릴리스에 대해 증분된 주 버전 번호를 나타냅니다.
  • 8은 부 버전 번호를 나타내며, 호환되는 버그 수정, 표준 API에 대한 개정 및 기타 작은 기능을 포함할 수 있는 부 업데이트 릴리스에 대해 증가합니다.
  • 0은 보안 향상에 필요한 수정 사항을 포함하여 중요한 수정 사항이 포함된 보안 업데이트 릴리스에 대해 증가된 보안 수준을 나타냅니다. $MINOR가 증가하면 $SECURITY가 0으로 재설정되지 않으므로 사용자는 이 버전이 더 안전하다는 것을 알 수 있습니다.
  • 162는 빌드 번호입니다.
  • b12는 추가 빌드 정보를 나타냅니다.

이 버전 관리 스타일은 Java 애플리케이션에 매우 일반적이기 때문에 일반적인 업계 관행에 맞추기 위해 이 버전 관리 스타일을 채택했습니다.

 

JAVA 9 - 2017년

  • 직소 프로젝트 시작
    • 런타임이 모듈화된 것이 가장 큰 특징. 서로 다른 패키지간의 캡슐화가 가능해짐. jigsaw는 모듈을 만들고 모듈에 명시적으로 외부에서 호출할 수 있는 API를 선언함. 언어 레벨에서 API 작성자가 외부에 노출한 API 외에는 접근불가. 모듈은 그 모듈에서 사용할 다른 모듈을 선언. JDK는 이 기능을 통해 모든 내부 API를 캡슐화하여 구성.
	// Java 코드 최상위에 module-info.java 파일을 만들고, 아래와 같이 사용함
	module java.sql {
		requires public java.logging;
		requires public java.xml;
		exports java.sql;
		exports javax.sql;
		exports javax.transaction.xa;
	}
  • Java를 쉘 처럼 사용할 수 있는 JShell 추가
  • interface에서 private method 지원
  • 향상된 try-with-resources : final 변수도 리소스로 사용가능
  • “_” 이 올바른 식별자명에서 제거됨
  • G1(Garbage-First) 가비지 수집기에 대한 향상된 기능. 이 기능이 기본 가비지 콜렉터가 됨
  • 내부적으로 더 작은 규모의 String 표현 사용
  • 동시성 업데이트(병렬 실행 관련)
  • collections 을 위한 Factory methods
	// 기존 collection
	List<String> temp = new ArrayList<>();
	cars.add("A1");
	cars.add("B1");
	cars.add("C1");
	...

  	// collection factory
	List<String> temp = Arrays.asList("A1", "B1", "C1");
  • 이미지를 처리하는 코드를 작성하는 데 사용되는 구성 요소의 이미지 처리 API 최적화 업데이트
  • 프로퍼티 파일에 UTF-8 지원
  • 이 버젼부터 64비트만 출시. 32비트는 나오지 않음

 

JAVA 10 - 2018년 3월

  • Oracle은 Java 릴리스 스타일을 변경하여 6개월마다 새 버전이 릴리스 됨.
  • Local-Variable Type Interface (로컬변수 타입추론)
    • 로컬 변수 타입을 var 로 선언 가능.
    • 제약사항 :
      • 로컬변수만 가능
      • 초기화 필수. null 불가.
	var list = new ArrayList<String>();	//ArrayList<String> 으로 추론
	
	var numbers = List.of(1, 2, 3, 4, 5);	//List<Integer> 으로 추론

	for (var number : numbers){		//Integer 추론
		System.out.println(number);
	}
  • GC 성능 향상
  • Appliction CDS(class data sharing) 기능 추가
    • 애플리케이션 로딩의 시작 시간 향상을 위한 JVM의 주요 기능. 서로 다른 JVM 간에 클래스 메타데이터를 공유할 수 있으므로 시작 시간과 메모리 사용량이 줄어듬.
  • 추가 동시성 업데이트(병렬 실행 관련)
  • 대체 메모리 장치에 힙 메모리 할당(JVM이 Java 프로그램을 실행하는 데 필요한 메모리(힙 메모리)를 대체 메모리 장치에 할당할 수 있으므로 힙을 휘발성 RAM과 비휘발성 RAM 간에 분할도 가능)
  • Thread-Local Handshakes VM safepoint(모든 쓰레드를 일시정지 시키는 작업)를 수행할 필요 없이 개별 스레드를 stop 시키고 콜백을 수행하도록 할 수 있는 기능.

 

JAVA 11 - 2018년 9월

  • LTS 버젼. JAVA 11 : 2026년 9월까지 지원
  • enterprise Java applications 및 Corba(원격 호출을 위한 매우 오래된 기술로 응용프로그램이 다른 컴퓨터에 설치된 응용프로그램과 통신할 수 있음) 모듈을 구축하는 데 사용되는 JEE 고급 구성요소 제거.
  • 람다 매개 변수에 대한 로컬 변수 구문을 사용하면 암묵적으로 입력된 람다 식의 형식 매개 변수를 선언할 때 var 키워드를 사용 가능
     (var x, var y) -> x.process(y) => (x, y) -> x.process(y)
    
  • 오버헤드가 낮은 가비지 컬렉터인 Epsilon(GC가 없으므로 기본적으로 GC 없이도 애플리케이션을 실행할 수 있음)은 기본적으로 가비지 수집에 더 많은 최적화를 제공
  • 병렬 실행과 관련된 더 많은 동시성 업데이트.
  • Nashorn JavaScript 스크립트 엔진 및 API는 향후 릴리스에서 제거하기 위해 더 이상 사용되지 않는 것으로 표시. ( ECMAScript 구조가 상당히 빠르게 진화하여 유지의 어려움 때문 )
  • Oracle JDK와 OpenJDK가 통합되었으며 Oracle JDK 가 유료 모델로 전환
  • 새로운 String 메서드 추가
     strip() : 문자열 앞, 뒤의 공백 제거
     stripLeading() : 문자열 앞의 공백 제거
     stripTrailing() : 문자열 뒤의 공백 제거
     isBlank() : 문자열이 비어있거나 공백만 포함되어있을 경우 true를 반환. 즉, String.trim().isEmpty() 호출과 같음
     lines() : 문자열을 라인 단위로 쪼개는 스트림을 반환
     repeat(n) : 지정된 수 만큼 문자열을 반복하여 붙여 반환
    

 

JAVA 12 - 2019년 3월

  • GC 일시 중지 시간을 단축하는 Shenandah라는 새로운 실험적 Garbage Collector(GC) 알고리즘.
  • 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);
     }
    
  • 주요 클래스 파일 및 런타임 아티팩트의 공칭 설명을 모델링하는 JVM 상수 API. 이 API는 클래스와 메서드를 조작하는데 유용.
  • G1 가비지 컬렉터 성능 개선
  • JDK 빌드 프로세스를 개선하기 위한 CDS(class data sharing) 아카이브를 기본값으로 설정함.
  • 약 100개의 마이크로벤치마크16이 JDK 소스에 추가

 

JAVA 13 - 2019년 9월

  • 동적 CDS 아카이브(JDK 12에 추가된 CDS 아카이브의 지원 향상)
    • 12에서는 클래스 목록을 만든 다음 해당 클래스 목록을 아카이브에 덤프하는 단계가 필요했음. 13에서는 동적 저장기능이 있어 어플리케이션 종료시에 공유 아카이브 생성 가능.
  • 가비지 컬렉터 기능 향상
  • 레거시 소켓 API의 새로운 구현
  • 유니코드 12.1 지원
  • 텍스트 블록 지원
     // 줄바꿈 문자 자동 지원
     String str = """
        This
        is
        text block
     """;
    
  • switch 문에 yield 예약어 추가
      var a = switch (day) {
         case MONDAY, FRIDAY, SUNDAY:
             yield 6;
         case TUESDAY:
             yield 7;
         case THURSDAY, SATURDAY:
             yield 8;
         case WEDNESDAY:
             yield 9;
     };
    

 

JAVA 14 - 2020년 3월

연산자 인스턴스에 대한 패턴 일치

  • Java 애플리케이션 및 JVM이 실행중일 때 프로파일링 및 진단 데이터를 수집하는 JFR Event Streaming API
  • G1 가비지 컬렉터의 추가 향상된 기능
  • CMS(Concurrent Mark Sweep) 가비지 컬렉터 제거
  • macOS용 Z 가비지 컬렉터 지원
  • 상용구 클래스를 선언을 줄여주는 record 도입.
     // 기존 상용구 클래스
     final class Point {
         public final int x;
         public final int y;
    
         public Point(int x, int y) {
             this.x = x;
             this.y = y;
         }
     }
     ...
    	
     // 레코드 사용
     record Point(int x, int y) { }
    
  • Java 힙 외부의 메모리에 안전하고 효율적으로 접근할 수 있도록 지원하는 외부 메모리 액세스 API
  • NullPointerExceptions 향상 : 정확히 어떤 변수가 null인지 기술해 줌.

 

JAVA 15 / 2020년 9월

  • Nashorn JavaScript 엔진 제거
  • sealed and hidden classes 추가
	/* 
	 * Game.java 파일
	 * permits 로 선언된 Nintendo, Sony class 만 Game class 를 상속할 수 있다.
	 */
	public sealed class Game permits Nintendo, Sony {}
	...
	
	/* 
	 * Nintendo.java 파일
	 * final 로 선언된 Nintendo Class. 다른 클래스에서 Nintendo 클래스를 상속할 수 없다.
	 */
	public final class Nintendo extends Game {} 	// Game Class 상속가능
	...


	/* 
	 * Sony.java 파일
	 * non-sealed 선언되었기 때문에 Sony class는 아무 클래스에서나 상속 가능하다.
	 */
	public non-sealed class Sony extends Game {}	// Game Class 상속가능
	...

	/* 
	 * Playstation.java 파일
	 * Nintendo 가 final 로 선언된 class 이기 때문에 상속할 수 없다.
	 */
	public class Playstation extends Nintendo {} // Nintendo Class 상속불가
	
	
	/* 
	 * Vita.java 파일
	 * non-sealed class 인 Sony.java 상속이 가능하다
	 */
	public class Vita extends Sony {} // 상속가능
	...
	
  • Edwards-Curve Digital Signature Algorithm(EdDSA) : 암호화 서명 지원
  • Legacy DatagramSocket API 성능 향상
  • Biased Locking이 비활성화 됨 : 멀티스레드 애플리케이션의 성능이 향상됨

 

JAVA 16 - 2021년 3월

  • Vector API 도입 : 대용량 데이터를 효과적으로 다루는 클래스. 용량 변경이 용이하며 어떤 종류의 객체도 담을 수 있음
  • JDK 내부의 강력한 캡슐화
  • Foreign Linker API 도입 : 다른 프로그래밍 언어로 작성된 라이브러리 및 외부 메모리에 액세스하기 위해서 사용되던 JNI(Java Native Interface)의 대체제
  • 사용하지 않는 HotSpot 클래스 메타데이터(즉, 메타스페이스) 메모리를 운영 체제로 보다 신속하게 반환할 수 있는 Elastic 메타스페이스의 도입

 

JAVA 17 - 2021년 9월

  • LTS버젼 : 2029년 9월까지 지원
  • JDK 16에 도입된 Vector API의 성능 및 구현 향상
  • sealed class 및 interface 개선
  • switch 문에 패턴 매칭 기능, Gaurded Patterns, Null Cases 추가
     return switch (obj) {
         case Integer i -> "It is an integer";
         case String s -> "It is a string";
         case Employee employee && employee.getDept().equals("IT") -> "IT Employee";
         case null -> "It is a null object";
         default -> "It is none of the known data types";
     };
    
  • macOS별 향상된 기능
  • 의사 난수 생성기를 위한 향상된 기능: 예측이 어려운 난수 생성 API 정식 추가
  • JDK 내부 캡슐화 기능 향상
  • Apple API 사용 안 함(JDK 18에서 제거 준비)
  • Security Manager 사용 안 함(JDK 18에서 제거 준비)
  • Foreign Function & Memory API는 개발자들이 JNI의 위험 없이 네이티브 라이브러리를 호출하고 네이티브 데이터를 처리할 수 있도록 하기 위해 이전에 인큐베이팅했던 두 개의 API인 Foreign-Memory Access API와 Foreign Linker API를 병합.

JDK 17의 기능 목록은 성능을 향상시키고 오래된 API를 사용/폐기하기 위해 JVM 내부에 초점을 맞추고 있음.

+ Recent posts