Java의 버전 별 역사와 특징
안녕~
오늘은 Java의 버전 별 역사와 특징에 대하여 간단하게 다루어 보겠습니다.
JDK 1.0(1991)
ㆍOAK 발표: GE사의 요청으로, 썬마이크로 시스템즈에서 C++의 단점을 극복하고자 만든 언어
ㆍ메모리 할당/해제의 어려움과 다중상속으로 인한 실수유발을 극복하려고 했다.
ㆍ1996년, JDK 1.0발표 : Java로 개명, Java Virtual Machine 1.0을 발표했다. Java Applet도 이때 처음 도입
JDK 1.0a2(1995)
ㆍ1995년 5월 23일 발표. 자바 언어 자체가 정식으로 발표된 날
ㆍ이때의 명칭은 Oak
JDK1.1(1997)
ㆍJDBC, RMI, Reflection, JIT, Inner Class 개념 포함
JDK 1.2(1998)
ㆍJava를 세 가지 버전으로 나누었다. (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가 가장 대표적)
ㆍLanguage: 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 사용 가능
"String in switch"
switch (mymind) {
case "SSAFY":
System.out.println("I love SAMSUNG"); break;
case "STUDY":
System.out.println("I hate Study"); break;
case "FIGHTING":
System.out.println("But..... Fighting!"); break;
case "HIHELLO":
System.out.println("Nice to meet you"); break;
default:
System.out.println("And you?");
}
"generics 내 타입 추론(Type Inference)"
// 7 버전 이전
List<String> list = new ArrayList<String>();
//7 버전 이후
List<String> list2 = new ArrayList<>();
ㆍAPI : Concurrency 강화, NIO 강화, sort강화, crypto강화, GPU강화
ㆍJavaFX가 기본으로 포함
ㆍJDK 7에서 정식으로 G1 GC를 포함하여 제공
-> 여기 들어가시면 Garbage Collection에 대해 주인장이 잘 설명해 놓았읍니다..
https://garonguri.tistory.com/119?category=1063307
5.14 Tech-Seminar : JAVA...에 대하여 1
짧은 시간 안에 Java의 모든 내용을 다룰 수는 없으므로 다음에 또 설명할 기회가 있길 바라며 간단히 목차를 작성해보았습니당 목차 더보기 1. Java 1-1. 특징 1-2. 장단점 1-3. 객체 지향과 절차 지향
garonguri.tistory.com
ㆍ안정적인 ARM지원
* 7 에서는 try with resource 구문이 추가되어 자동으로 자원들을 close한다.
이러한 메커니즘을 사용하기 위해서는 AutoClosable, Closeable 인터페이스를 구현해야 한다.
Java 7의 Streams, Files, Socket, DB Connection등은 해당 인터페이스를 구현하고 있다.
"7 이전"
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;
Java 8(2014)
ㆍOracle 인수 후 첫 번째 버전.
ㆍJDK는 2개 버전으로 나뉨.
- Oracle JDK : 폐쇄적인 상업 코드 기반 - 글꼴 라이브러리와 Java Web Start 존재
- Open JDK : 오픈 소스 기반
ㆍLambda 및 함수형프로그래밍, Default Method Interface, 메소드 참조 기능 추가
ㆍAPI : Nashorn (JS엔진), new Date and Time API, Stream API, Collection에 대한 함수형화 (Interface에 default로 인해 가능)
, 새로운 날짜와 시간 API인 java.time 패키지를 제공
* 기존 Calendar 클래스에서는 월(month)을 나타낼 때 1월부터 12월을 0부터 11까지로 표현해야 하는 불편함이 있었고, 불변 객체(immutable object)가 아니라서 값이 수정될 수 있었다.
LocalDate today = LocalDate.now();
System.out.println("올해는 " + today.getYear() + "년입니다.");
//올해는 2022년입니다.
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)
ㆍ Oracle JDK + Open JDK 통합!
ㆍ일반 지원은 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문의 확장
// Java12 이전
String mymind;
switch (weekday) {
case SUNDAY:
case SATURDAY:
mymind = "짱조음";
break;
case THURSDAY:
case FRIDAY:
mymind = "조음";
break;
default:
mymind = "짱시름";
}
// Java12 이후
String mymind = switch (weekday) {
case SUNDAY, SATURDAY -> "짱조음";
case THURSDAY, FRIDAY -> "조음";
default -> "짱시름";
};
Java 13 특징 (2019.09)
ㆍSwitch문에 yield 예약어 추가
- yield 예약어가 추가됨. (yield x 하게 되면 x가 리턴)
- yield는 예약어이지만 변수명으로 사용가능하다. ex) int yield = 3;
//Java13
returnNum = switch(num){
case 1 : yield 3;
default : throw new IllegalStateException("unexpected value : " + num);
};
ㆍUnicode 12.1 지원
ㆍFileSystems.newFileSystem() 메소드 추가
Java 14 특징 (2020.03)
ㆍ(Preview) instanceof 의 강화
ㆍPackaging Tool - Incubator 추가
ㆍHelpful NullPointerException - NPE시 라인넘버만이 아닌 어느 객체에서 발생했는지 표시
ㆍrecord 등장! (뒤에서 자세히 다룸)
Java 15 특징 (2020.09)
ㆍEdDSA 암호화 알고리즘 추가
ㆍ패턴 매칭
ㆍZGC 가비지 컬렉터 추가
ㆍSolaris 및 SPARC 플랫폼 지원 제외
ㆍ외부 메모리 접근 API 추가
ㆍ(Preview) 봉인 클래스 https://openjdk.org/jeps/360 (궁금하면 클릭!)
- 봉인 클래스
Java 16 특징 (2021.03)
ㆍ(14의 기능으로부터 확정) instanceof 패턴 매칭 강화
ㆍElastic Metaspace (메타스페이스에 대한 관리 기능 강화)
ㆍEnable C++14 Language Features
ㆍPackaging Tool
ㆍ(Incubator) Vector API
[Java 15 ~] Record
Java Record 자바 14에서 preview로 등록되었고 자바 16 버전에 정식으로 새로운 기능으로 Record Type이 추가되었습니다.(나모찾기님 수정) 내용을 간단하게 설명하자면 기존의 POJO 객체를 만들 때 get~, se
marrrang.tistory.com
- Record란?
- record 선언의 헤더에 내용에 필요한 값을 지정하여, 적절한 접근자, constructor, equals, hashCode, and toString 메서드가 자동으로 생성되게 하는 기능이다.
- record class는 final class라 상속할 수 없고, 각 field는 private final이다.
- https://dzone.com/articles/jdk-14-records-for-spring-devs (레코드 사용 방법이 궁금하면 click! 난 안궁금함)
Java 17 특징 (2021.09)
ㆍContext-Specific Deserialization Filters (컨텍스트 기반의 역직렬화 필터링)
ㆍ(Second Incubator) Vector API
ㆍDeprecate the Security Manager (Security Manager Deprecate 지정)
ㆍRemove the Experimental AOT, JIT Compiler
[Java] Sealed Class
Java 17의 release note를 보다 보면 Sealed Class가 정식으로 확정된 것으로 보입니다. JDK 15부터 프리뷰로 추가되었던 것 같은데 한 번도 써본 적이 없네요. ㅎㅎ 오늘 알아보도록 하겠습니다. Sealed Class
marrrang.tistory.com
- 위에서 봤던 봉인 클래스가 정식으로 확정됨.
- Java에서 보다 세분화된 상속 제어를 활성화하는 것이다. (상속 타입을 제한)
- 봉인을 통해 클래스와 인터페이스는 허용되는 하위 유형을 정의할 수 있다.
- 즉, 클래스 또는 인터페이스는 이제 이를 구현하거나 확장할 수 있는 클래스를 정의할 수 있다.
- 도메인 모델링이나 라이브러리 security 강화에 유용하다.
Java 18 특징 (2022.03)
ㆍUTF-8을 Java Standard API의 기본 charset으로 설정
ㆍsimple web server를 위한 command-line tool 제공
ㆍReimplement Core Reflection with Method Handles
ㆍinternet-address resolution SPI
ㆍDeprecate finalization for Removal
여기까지 보느라 고생하셨습니다.
꼭 알아두어야 할(?) 버전별 특징만 보겠습니다.
[Java Version]
- 1.5
- 기능적으로 가장 많은 변화가 생김.
- Language
- Generic
- Annotation
- AutoBoxing
- Enum
- static
- imports
- API
- Scanner class
- 6
- Language
- GC G1지원
- JVM 성능 향상
- stnchronization
- comiler
- GC
- Language
- 7
- Language
- try-resource (자동으로 자원 반납, AutoClosable/Closable Interface)
- String in switch
- generics 타입 추론
- 숫자 _사용
- 정식으로 G1 GC 포함해 제공
- JVM
- Dynamic Language support
- Language
- 8
- JDK는 2개 버전으로 나뉨. (폐쇄/상업 Oracle, 오픈소스 기반 Open)
- Language
- Lambda
- 함수형 프로그래밍
- Default 메소드 Interface
- 메소드 참조 기능
- Optional
- API
- Stream
- Collection 함수형화
- new Date/Time
- 9
- Interface 내 Private Method
- 불변 Collections 제공
- 모듈러 시스템 (jigsaw)지원
- 10
- var 키워드를 이용한 지역변수 선언 및 타입추론 가능
- 병렬처리 GC 도입으로 성능 향상
- JVM 힙 영역을 시스템 메모리가 아닌 다른 종류 메모리에도 할당
- 11
- 두 JDK의 통합
- 람다에서 로컬 변수 var 사용 가능
- 네스트 기반 엑세스 컨트롤
- String에 새로운 메소드 추가
- 12
- 유니코드11지원
- switch문의 확장 ( 복수 case 쓸 수 있음)
- 13
- switch에 yield 예약어 추가
- 14
- instanceof 패턴매칭의 preview
- record preview
- 유용한 NullPointerExceptions
- 15
- 패턴 매칭
- 16
- instanceof 패턴 매칭 강화
- Vector API 처음 도입
- Record 기능 추가 (데이터 오브젝트 선언 기능)
- 17
- Java 11 이후의 새로운 Java LTS(장기 지원) 릴리스
- Pattern Matching for switch (Preview)
- 봉인 클래스 (Sealed Class) 추가
- 18
- UTF-8을 java Standard API의 기본 charset으로 설정
- simple web server를 위한 command-line tool 제공
난 죽어도 못외우겠다. 한다면 딱 4개 릴리스만 외우세요
8, 9, 10, 17
개발자 입장에서 가장 대규모 릴리스였던 8! 따라서 7->8 어떻게 바뀌었는지?
9에서도 모듈시스템같은 추가사항이 있어 상당히 큰 릴리스였다.
10은 GC과 같은 변경 사항이 존재하므로!
17은 최근 나왔던 가장 큰 릴리스이므로,
18은 그냥 가장 최근에 나온거니까 외우자.
그럼 끄읕~
참고
서울IT아카데미 홍대_자바,게임,빅데이터,웹툰,쇼핑몰창업,국비지원,학원
과정평가형,정보처리산업기사,Java,IT,프로그래밍,국비지원 교육,홍대입구,자격증,취업,학원
www.seoulit.or.kr
https://marrrang.tistory.com/16
Java 각 버전의 특징들 (~JAVA18)
Java 1.8이 나온지는 벌써 6년정도 되었습니다. 그동안 java 1.8을 꾸준히 사용해오고 jdk 11뿐만 아니라 최근에는 jdk 17까지 나온 상황입니다. 이 시점에서 다시 한번 정리하면 좋을 것 같아서 Java 1.8
marrrang.tistory.com