4차산업혁명의 일꾼/Spring

자바의 버전 변천사를 통한 자바 이해

르무엘 2023. 3. 14. 17:48

버전을 설명하기 전에 자바의 JVM 간단 설명

[JVM 구성요소 : 클래스로더시스템 , 메모리, 실행엔진]

1. 클래스 로더는 말 그대로, 클래스를 읽어오는 시스템 구조인데, 로딩 -> 링크, 초기화순으로 진행된다.

2. 메모리는 스택, 레지스터, 힙, 메소드, 네이티브메서드스택으로 구성된다.

 (1) 힙은 인스턴스화된 모든 클래스 인스턴스와 배열을 저장, 객체를 저장하게 되는데, 모든 JVM 스레드에 공유되는 공유자원이다.

 (2) 메소드영역에서는 런타임 상수풀, 필드와 메소드 데이터 내용 ,즉 클래스 수준의 정보를 저장하게 된다. (논리적으로는 메소드는 힙의 일부다.)

 (3) PC 레지스터는 현재 실행중인 메서드가 네이티브가 아니면, 현재 실행중인 JVM명령어 위치에 저장되고, 네이티브이면 PC레지스터에 저장되는 값은 저장되지 않는다. CPU의 레지스터와 다르게, 연산을 위해 필요한 피연산자를 임시로 저장하기 위한 용도로 사용한다.

 (4) 스택(JVM 스택이라고도 불린다.) 은 LIFO동작으로, 쓰레드 마다 런타임 스택을 만들고 , JVM스택에는 프레임에 저장된다. 메서드 하나가 호출될 때마다 새 프레임이 생성되어 스택에 쌓이고, 메서드 호출이 정상 완료되거나 예외가 던져지면 프레임은 스택에서 빠지면서 소멸된다. 또한 쓰레드가 종료되면 스택도 제거된다.

 (5) 네이티브 메소드 스택 : 네이티브 메서드 스택은 JVM의 스택이 아니라 C스택을 가르킨다. 자바가 아닌 다른 언어로 작성된 메서드를 지원하기 위해 사용되는 스택( JVM스택과 마찬가지로 스레드 단위의 자료구조)

[하기 참고]

https://homoefficio.github.io/2019/01/31/Back-to-the-Essence-Java-%EC%BB%B4%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C-%EC%8B%A4%ED%96%89%EA%B9%8C%EC%A7%80-2/

 

Back to the Essence - Java 컴파일에서 실행까지 - (2)

Back to the Essence - Java 컴파일에서 실행까지 - (2)Java 11 JVM 스펙을 기준으로 Java 소스 코드가 어떻게 컴파일되고 실행되는지 살짝 깊게 알아보자. 이번엔 2탄 실행 편이다. 1탄 컴파일 편은 여기에..

homoefficio.github.io

3. 실행엔진은 말 그대로 클래스 로딩 과정을 통해 런타임 데이터 영역에 배치된 바이트 코드를 명령어 단위로 읽어서 실행하게 된다. 이제 이 과정을 수행하고 기계가 읽을 수 있는 코드로 변경을 해주는데 이 때 사용되는게 인터프리터와 JIT컴파일러이다.

 

[이펙티브 자바 참고]

=>네이티브 메서드는 신중하게 사용하라

https://itstory.tk/entry/%EC%9D%B4%ED%8E%99%ED%8B%B0%EB%B8%8C-%EC%9E%90%EB%B0%94-%EA%B7%9C%EC%B9%9954-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C-%EB%A9%94%EC%84%9C%EB%93%9C%EB%8A%94-%EC%8B%A0%EC%A4%91%ED%95%98%EA%B2%8C-%EC%82%AC%EC%9A%A9%ED%95%98%EB%9D%BC

 

[이펙티브 자바] 규칙54. 네이티브 메서드는 신중하게 사용하라

이펙티브 자바 Effective Java 2/E국내도서저자 : 조슈아 블로크(Joshua Bloch) / 이병준역출판 : 인사이트 2014.09.01상세보기 자바의 네이티브 인터페이스(Java native interface, JNI)는 C나 C++ 등의 native programming

itstory.tk

 

 

자바 8 : 람다, 스트림, 인터페이스 디펄트 메소드, 옵셔널, LocalDateTime

(연장지원은 2023년 9월 종료 - 32비트 지원하는 마지막 버전, 이후는 서드파티에서만 지원)

 

자바9 : Project Jigsaw 기반으로 런타임이 모듈화된 것이 가장 큰 특징

본래는 2016년 발표 예정이었으나 2번이나 연기되어 2017년 7월 27일 발표 예정, 그나마도 한번 더 연기되어 9월 21일에 발표되었다. 가장 큰 원인은 역시 Project Jigsaw의 개발 난이도였다. 런타임의 모듈화는 하위 호환성을 어느 정도 포기하고 성능을 추구한 것이기에 아직 현장에서는 Java 9로 넘어가는 것을 꺼리는 분위기다. (2018년 3월에 종료)

 모듈이란 이름(name), 어떤것을 제공(export)하고 어떤것들이 필요한가(require)를 선언하는 소프트웨어적 단위

JDK의 모듈화는 사용하려는 Java Runtime의 모듈을 따로 지정할 수 있음을 의미한다. 이제는 java.desktop 또는 java.corba를 사용하지 않는 경우, Swing 또는 Corba 모듈이 포함된 환경에서 애플리케이션을 실행할 필요가 없다.(애플리케이션에서 사용하는 모듈만 모아  Runtime이미지를 만들수 있다.)

https://infoscis.github.io/2017/03/24/First-steps-with-java9-and-jigsaw-part-1/

 

Java 9 와 Project Jigsaw 소개 1

의역, 오역, 직역이 있을 수 있음을 알려드립니다.이 포스트는 원저자의 동의를 얻어 한글로 번역한 내용입니다. This post is a translation of this original article [https://blog.codecentric.de/en/2015/11/first-steps-wi

infoscis.github.io

 

자바10 : var 키워드, 자바소스파일 컴파일 전 실행가능

( Java 기반의 JIT 컴파일러가 추가되었고, 이전 버전에서 Deprecated 처리된 API는 Java SE 10에서 모두 삭제되었다.)

=> JIT(Just In Time) : 컴파일시 바이트코드를 저장소 저장하는 개념 ( 인터프리터가 안읽어도 된다.)

 

 

자바11 : 오라클, 오픈 JDK 통합 (2018년 9월 25일 발표 , 일반지원은 2023년 9월 , 연장지원은 2026년 9월에 종료될 예정)

이클립스 재단으로 넘어간 java EE가 JDK에서 삭제되고(스프링에 주도권을 빼앗겨 오라클은 자바EE수익화 실패- 자바EE8이 마지막 버), JavaFx도 JDK에서 분리되어 별도의 모듈로 제공된다.

( Java Fx는 경량 사용자 인터페이스 API를 사용하여 리치 인터넷 어플리케이션을 만들때 사용된다. JavaFx 어플리케이션은 하드웨어 수준에서 가속기능을 사용할 수 있는  그래픽과 미디어 엔진을 갖추고 있어 보다 클라이언트의 성능에 신경을 써야하는 분야에서 사용하면 좋다. JavaFx어플리케이션 또한 자바 EE플랫폼 서비스의 클라이언트 역할들 담당한다.)

Gloun 이라는 업체가 JavaFX를 유지보수 중 : https://gluonhq.com/products/javafx/  

* Oracle JDK가 구독형 유료 모델로 전환된다는 점 * => Azul Systems개발 https://www.azul.com/downloads/#zulu

Zulu JDK는 오라클의 TCK인증을 받은 구현체로 개인과 기업 모두 무료로 사용할 수있다.(기술지원만 유료)

 

자바 12: 스위치 문 확장, 가비지 컬렉터 개선 (2019년 3월 19일 공개)

 

자바 13 : 스위치문에 yield 예약어 추가 ( 2019년 9월 17일 공개)

 

자바14 : 스위치 표현시 표준화, instanceof 패턴 매칭, record 데이터 오브젝트 선언 기능 추가 (2020년 3월 18일 공개)

 

자바 15 (2020년 9월 15일 공개)

EdDSA암호화 알고리즘 추가 (자바는 JCA[Java Cryptography Architecture]와 , JCE [Java Cryptography Extension] 를 기반으로 오래전부터 보안 관련기능을 제공해왔다.  )  : JCA는 JDK1.1부터 제공된 암호화 기능을 담은 보안 관련 핵심 프레임워크다. 전자서명, 메시지를 해시하는 메시지 다이제스트, 인증서와 인증서 유효성 검사, 암호화 및 복호화, 키 생성과 관리 API를 포함한다.

공개 키 암호화에서 Edwards-curve EDDSA (Digital Signature Algorithm)는 트위스트 에드워드 곡선(Twisted Edwards curve)을 기반으로하는 Schnorr 서명의 변형을 사용하는 디지털 서명 체계이다

https://perfectmoment.tistory.com/1231

 

SSH의 공개키 암호화에는 'RSA', 'DSA', 'ECDSA', 'EdDSA' 중 어떤 것을 사용하면 좋을까?

원격으로 컴퓨터에 액세스하기 위한 프로토콜인 SSH는 컴퓨터의 인증을 위해 공개키 암호화를 사용하고 있습니다. 공개키 암호화 방식인 RSA, DSA, ECDSA, EdDSA의 각각의 구조와 'SSH에 적합한 방식'에

perfectmoment.tistory.com

 

패턴 매칭( 2차 미리보기) , 스케일링 가능한 낮은 지연의 가비지 컬렉터 추가

Solaris(썬마이크로 시스템 -os) 및 SPARC플랫폼(썬마이크로 시스템 - 확장형 프로세서 아키텍처) 지원제거 , 외부메모리 접근 API , 레코드(2차 미리보기) , 클래스 봉인 - 상속가능한 클래스 지원

public sealed class Animal
       Dog,
	   wiki.namu.example.species.india.Monkey,
	   wiki.namu.example.species.sabana.Leopard
{
    // ...
}

다중 테스트 블록 : 자바에서도 여러줄의 문자열을 손쉽게 작성

 

자바16(2021년 3월 16일 출시) 

자바에서도 자동 병렬 프로세싱을 지원하는 자동 벡터 API가 추가

OpenJDK의 버전 관리가 Mercurial 이었으나 이제 Git으로 바뀐다. 

OpenJDK 소스를 GitHub에서 볼 수 있다.

자바11부터 시작했으며 15부터 도입한 ZGC기능이 향상 ( ZGC는 메타데이터를 객체의 메모리 주소에 표시한다. ZGC는 64비트만 지원하는데, 메모리의 주소 파트로 42비트(4TB)를 사용하고 다른 4비트를 GC metadata( finalizable, remap, mark1, mark0 ) 를 저장하는 용도로 사용한다.

https://www.blog-dreamus.com/post/zgc%EC%97%90-%EB%8C%80%ED%95%B4%EC%84%9C

 

ZGC에 대해서

Java ZGC의 동작 원리와 특징에 대해서 상세히 알아보고, 이를 통해 현업에 ZGC 도입시 주의할 점도 함께 살펴봅니다.

www.blog-dreamus.com

유닉스 도메인 소켓이 지원

Alpine Linux 지원 추가

자바8부터 제거된 악명 높은 PermGen 대신 Metaspace방식을 지원  (자바의 Classlader가 로드한 class들의 metadata가 저장되는 공간 -  Heap 사이즈모니터링 뿐만 아니라 Metaspace에 대한 모니터링이 필요할 수도 있다)

JNI(Java Native Interfac)를 대신할 외부 링크방식의 인터페이스를 인큐베이팅을 통해 시작한다.  

값유형의 클래스를 동기화에 사용 시 경고 메세지가 개선되었다.

public class JEP390 {

    public static void main(String[] args) {

        Double d = 20.0;
        synchronized (d) {} // 컴파일 시 해당 줄 내용과 함께한 경고 메시지가 친절히 표시된다.
    }
}

jpackage 명령어를 통해 각 운영체제별 자바 프로그램을 설치 패키지(pkg, deb,msi 등) 로 생성하는 기능이 정식으로 추가되어, 자바프로그램을 손쉽게 배포하는 기능이 추가된다.

자바 15의 외부메모리 접근 인큐베이팅 2차

자바14의 패턴 매칭이 정식 기능으로 추가

자바 9부터 추가되어 자바 내부 API 접근에 대한 경고 무시 기능이 강화되어 내부 API접근 시도시 기본적으로 오류와 함께 자바 프로그램이 종료될 수 있도록 강화

자바 15에 추가된 봉인 클래스의 2차 미리보기

 

 

자바 17( 자바8,11을 이을 세번째 LTS버전이 한국시각 2021년 9월 15일에 출시 되었다.)

패턴매칭은 여전히 Preview단계이다.

외부 함수/메모리 API 및 신규 벡터 API는 인큐베이팅 단계이다.

애플릿이 완전히 제거될 예정으로 Deprecated 처리.

애플 M1 및 이후 프로세서 탑재 컴퓨터 제품군에 대한 정식 지원

macOS 그래픽 렌더링 베이스를 OpenGl에서 Metal로 교체

의사난수 생성기를 통해 예측하기 어려운 난수를 생성하는 API정식 추가

컨텍스트 기반의 역직렬화 필터링 

봉인클래스가 정식 추가되었다.

자바18 (2022년 3월 22일에 출시)

자바 API의 기본 Charset이 UTF-8로 지정되었다.

정적 파일을 서빙하는 기능만 있는 심플한 웹서버 제공(커맨드라인툴)

Java API Doc에 @snippet 태그 추가

리플렉션 기능 리팩터링(메소드 핸들을 이용해 다시 구현)

벡터 API ( 세번째 인큐베이터 단계)

Internet-Address Resolution SPI

외부 함수 & 메모리 API (두번째 인큐베이터 단계)

switch 문 패턴 매칭 ( 두 번째 프리뷰)

try문의 finally 기능 deprecate (아직 제거 되진 않았지만 사용을 권장하지 않는다. try -with-resources를 이용하자)

 

자바19 (2022년 9월에 출시)

레코드 패턴매칭(프리뷰)

Linux/RISC- V port

외부 함수 & 메모리 API (프리뷰)

가상 쓰레드 (프리뷰)

벡터 API (네번째 인큐베이터 단계)

switch 문의 패턴 매칭( 세번째 프리뷰)

멀티쓰레드 프로그래밍을 단순화하는 Structed Concurrency API(인큐베이터 단계)

 

자바20 (2023년 3월에 출시)

Scoped Values(인큐베이터 단계)

레코드 패턴 매칭(두번째 프리뷰)

switch 문 패텅 매칭(네 번째 프리뷰)

외부함수 & 메모리 API (두번째 프리뷰)

가상 쓰레드( 두 번째 프리뷰)

Structed Concurrency( 두번째 인큐베이터 단계)

 

자바21(2023년 9월에 출시예정 , 자바8,11,17에 이은 네번째 LTS)

 

 


 

결론적으로 자바8, 자바11, 자바17 이 세가지 LTS버전을 기준으로 생각할 때

JavaEE가 제거된 자바11, 보안이 강화된 자바17을 생각하면

어짜피 스프링부터 시작한 개발자는 자바 17을 사용해서 개발하는게 낫다는 결론이 이른다.

 

자바21도 올해 9월 4번째 LTS출시예정이라고 한다...

참 버전 나오는 속도가 빠르다.

어쨌거나 정리하고 나니 자바 17을 써서 공부해야겠다.

 

https://marrrang.tistory.com/16

 

Java 각 버전의 특징들 (~JAVA18)

Java 1.8이 나온지는 벌써 6년정도 되었습니다. 그동안 java 1.8을 꾸준히 사용해오고 jdk 11뿐만 아니라 최근에는 jdk 17까지 나온 상황입니다. 이 시점에서 다시 한번 정리하면 좋을 것 같아서 Java 1.8

marrrang.tistory.com

 

LIST