DevGang
[Java] 자바 버전별 특징 본문
JDK 1.0(1991)
- OAK 발표: GE사의 요청으로, 선마이크로 시스템즈에서 C++의 단점을 극복하고자 만든 언어
- 메모리 할당/해제의 어려움과 다중 상속으로 인한 실수유발을 극복하려고 했다.
- 1996년, JDK 1.0 발표 : Java로 개명, Java Virtual Machine 1.0을 발표했다. Java Applet도 이때 처음 도입
JDK1.1(1997)
- JDBC, RMI, Reflection, JIT, Inner Class 개념이 포함
JDK 1.2(1998)
- Java SE 1.2, ME 1.2, EE 1.2 세 가지 버전으로 발표 - Swing이 SE에 포함, Corba IDL(이종기기간 함수 호출 스펙), Collection Framework 포함
JDK 1.3(2000)
- HotSpot(Sun에서 만든 JIT구현)
- JNDI(디렉터리 및 이름으로 원하는 서비스 찾음)
JDK 1.4(2002)
- Java Web Start포함 (웹 브라우저에서 한 번의 클릭으로 모든 기능을 갖춘 응용 프로그램을 실행할 수 있는 기능을 제공하는 응용 프로그램 배포 기술)
- JCP(Java Community Process)에 의해서 오픈소스 정책으로 자바가 관리되기 시작한 버전
- Java 2 Security 모델의 확립
- Language: assert 도입
- API : Regular Expression, Assert keyword, Security 2 version(현재 security model), Non Blocking IO(NIO)
Java 1.5(2004)
- 기능적으로 가장 많은 변화가 생긴 버전 (Generics가 가장 대표적)
- LanguageI: Generics , annotation, auto boxing, enum, vararg , foreach, static imports 도입
- API : java.util.concurrent API, scanner class
Java 6(2006)
- 가비지 컬렉터 G1(Garbage First) GC 지원
- JDK 6에서는 G1 GC를 early access라고 부르며 그냥 시험 삼아 사용할 수만 있도록 한다.
- 보안, 성능 강화
- JVM/Swing에 있어 많은 Performance 향상(synchronization, compiler, GC, start-up time)
Java 7(2011)
- JVM : Dynamic Language support (invoked dynamic - new byte operation)
- Language : try-resource, String in Switch, generics 내 타입 추론, 숫자에서 underscore 사용 가능
- API : Concurrency 강화, NIO 강화, sort강화, crypto강화, GPU 강화
- JavaFX가 기본으로 포함
- JDK 7에서 정식으로 G1 GC를 포함하여 제공
- 안정적인 ARM 지원
* generics 내 타입 추론
// 이전 버전
Map <String, Object> user = new HashMap<String, Object>();
// 7버전
Map<String, Object> user = new HashMap<> ();
* Switch문에서 문자열 허용
switch (day) {
case "NEW":
System.out.println("Order is in NEW state");
break;
case "CANCELED":
System.out.println("Order is Cancelled");
break;
case "REPLACE":
System.out.println("Order is replaced successfully");
break;
case "FILLED":
System.out.println("Order is filled");
break;
default:
System.out.println("Invalid");
}
* 7 에서는 try with resource 구문이 추가되어 자동으로 자원들을 close 한다.
이러한 메커니즘을 사용하기 위해서는 AutoClosable, Closeable 인터페이스를 구현해야 한다.
Java 7의 Streams, Files, Socket, DB Connection 등은 해당 인터페이스를 구현하고 있다.
// 이전버전
public static void main(String args[]) {
FileInputStream fin = null;
BufferedReader br = null;
try {
fin = new FileInputStream("info.xml");
br = new BufferedReader(new InputStreamReader(fin));
if (br.ready()) {
String line1 = br.readLine();
System.out.println(line1);
}
} catch (Exception ex) {
System.out.println("error!!");
} finally {
try {
if (fin != null) fin.close();
if (br != null) br.close();
} catch (IOException ie) {
System.out.println("Failed to close files");
}
}
}
// 7버전
public static void main(String args[]) {
try (FileInputStream fin = new FileInputStream("info.xml");
BufferedReader br = new BufferedReader(new InputStreamReader(fin));) {
if (br.ready()) {
String line1 = br.readLine();
System.out.println(line1);
}
} catch (Exception ex) {
System.out.println("error");
}
}
}
* Fork/Join Framework
- fork/join framework는 멀티 프로세서의 성능을 이용할 수 있는 ExecutorService인터페이스의 구현체이다. 반복적으로 작은 조각으로 작업을 나누어 수행할 수 있게 설계되어있다.
* Underscore in Numeric literal
- 숫자형(정수, 실수)에 _(underscore) 문자열을 사용할 수 있다. 큰 숫자를 다룰 때 가독성이 좋아진다.
int billion = 1_000_000_000; // 10^9
long creditCardNumber = 1234_4567_8901_2345L; //16 digit number
long ssn = 777_99_8888L;
double pi = 3.1415_9265;
float pif = 3.14_15_92_65f;
Java 8(2014)
- JDK는 2개 버전으로 나뉨. 하나는 폐쇄적인 상업 코드 기반의 Oracle JDK, 하나는 오픈 소스 기반의 OpenJDK이다.
- Oracle JDK에 존재하고 OpenJDK에는 없는 대표적 기능으로 글꼴 라이브러리와 Java Web Start가 있다. 서버 애플리케이션 개발에는 쓰이지 않는 기능들이다.
- Lambda 및 함수형 프로그래밍, Default Method Interface, 메서드 참조
- JEP에 의해서 새로운 기능들이 발의되기 시작
- API : Nashorn (JS엔진), new Date and Time API, Stream API, Collection에 대한 함수형화 (Interface에 default로 인해 가능) 새로운 날짜와 시간 API인 java.time 패키지를 제공
* 기존 Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있다.
* 기존 Calendar 인스턴스는 불변 객체(immutable object)가 아니라서 값이 수정될 수 있습니다.
LocalDate today = LocalDate.now();
System.out.println("올해는 " + today.getYear() + "년입니다.");
Java 9(2017)
- Java용 REPL, JShell 등장 (대화식 REPL(Read Eval print Loop) 도구 제공)
- Modular System (Jigsaw) 지원
- 불변 Collection(immutable collection) 제공
- Java 9는 익명 클래스에 대한 Diamond Operator를 허용 (anonymous inner 클래스에서 diamond operator 사용 가능)
- try-with-resources 개선
- 인터페이스 내 private 메서드 사용 가능
- Reactive Stream API 추가
- Optional To Stream
- HTTP2 Client
- iCMS GC Deprecated 됨
Java 10(2018)
- var 키워드를 이용한 지역변수 선언 및 타입 추론 가능
- 불변(Unmodifiable) Collection 향상
- 병렬 처리 가비지 컬렉션 도입으로 인한 성능 향상
- 개별 스레드로 분리된 Stop-The-World
- 루트 CA 목록 등 추가
- JDK의 Repository가 하나로 통합
- JVM 힙 영역을 시스템 메모리가 아닌 다른 종류의 메모리에도 할당 가능
- 실험적인 Java 기반의 JIT(Just In Time) 컴파일러 추가
- Deprecated 된 API는 Java SE 10에서 모두 삭제
Java 11(2018.09)
- 일반 지원은 2023년 9월, 연장 지원은 2026년 9월에 종료될 예정이다.
- 이클립스 재단으로 넘어간 Java EE가 JDK에서 삭제되고, JavaFX도 JDK에서 분리되어 별도의 모듈로 제공된다.
- 람다 파라미터에 대한 지역변수 문법
(var x, var y) -> x.process(y) => (x, y) -> x.process(y)
IntStream.of(1, 2, 3).filter((var i) -> i % 2 == 0).forEach(System.out::println);
IntStream.of(1, 2, 3).filter(i -> i % 2 == 0).forEach(System.out::println);
- HTTP 클라이언트 표준화 기능 추가 : Java 9, 10에 사용되었던 jdk.incubator.http 패키지가 표준화되어 java.net.http 패키지로 추가
- 네스트 기반 액세스 컨트롤(Nest-based access controls)
- 액세스 가능성을 확장하는 브리지 메서드 삽입 지원 컴파일러의 필요성 제거
- 다이내믹 클래스-파일 콘스탄스(Dynamic class-file constans)
- 새로운 형태의 구체화 가능한 클래스 파일 상수를 만드는데 요구되는 비용과 간섭을 줄이고, 표현력과 성능을 위한 보다 다양한 옵션 제공
- 엡실론(Epsilon) 가비지 컬렉터 : 오버헤드의 최저 지연과 할당 제한이 가능한 완전한 수동 가비지 컬렉터 적용
- The Z Garbage Collector(ZGC) : 대기 시간이 낮은 확장 가능한(Scalable Low-Latency) GC이다.
- 플라이트 레코더(Flight Recorder) : 자바 애플리케이션과 핫스폿 JVM의 오류 해결을 위한 낮은 오버헤드 데이터 수집 프레임워크 제공
Java 12(2019.03)
- 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);
}
출처 : 서울it 직업전문학교 -학습자료실
'Study > Java' 카테고리의 다른 글
[Java] JVM(Java Virtual Machine) (0) | 2021.04.18 |
---|---|
[Java] GC(Garbage Collection) (0) | 2021.04.18 |
[Java] JCF(Java Collections Framework) (0) | 2021.04.17 |
[Java] 제네릭(Generic) (0) | 2021.04.07 |
[Java] JVM, JRE, JDK (0) | 2021.04.07 |