자바를 많이 써오면서 여러 JDK 를 쓰게 되고 이럴 때 JDK의 버전도 다르고 배포하는 사이트도 다르고 또 이들끼리 차이점이 뭔지도 모르겠고 해가지고 정리할겸 이 글을 쓴다
[Reference]
Wiki
with chatGPT
그래도 java에 대한 얘기니까 가장 기본적인 JDK에 대해서 알아보자
Java Development Kit"의 약자로, 자바 프로그래밍 언어로 소프트웨어를 개발하고 실행하기 위한 개발 도구 모음이다. 자바 언어의 컴파일, 디버깅, 실행, 문서화 등을 지원하는 핵심 도구와 라이브러리로 구성되어 있다.
<구성요소>
Java Runtime Environment (JRE): 자바 애플리케이션을 실행하는 데 필요한 런타임 환경을 제공함. JRE는 자바 가상 머신 (JVM) 및 필수 라이브러리 등을 포함함.
자바 가상 머신 (JVM): 자바 바이트 코드를 기계어로 변환하여 실행하는 역할을 함. 각 플랫폼에 특화된 JVM이 제공되어 Java 애플리케이션이 여러 운영 체제에서 실행됨.
자바 API 라이브러리: 표준 Java 클래스 라이브러리와 다양한 API를 포함하여 프로그래머가 자바 애플리케이션을 개발할 때 사용할 수 있는 기본적인 도구와 자원.
JDK의 다운로드를 지원하는 사이트가 여러가지이다.
자바는 원래 썬 마이크로시스템즈에서 개발 되었지만, 실제로 지금은 여러 기업과 커뮤니티에서 자바 개발 환경을 배포한다. 이렇게 여러 기업에서 배포하는 jdk는 다른 특징과 기능을 제공한다. 라이선스 및 이용약관이 일단 많이 다르고, 유지보수에 대한 정책도 다르다.
OpenJDK
OracleJDK
Oracle JDK vs OpenJDK
Adoptium
Azul Zulu, Amazon Corretto, SAPMachine
버전 별 특징을 알아보기 전에 버전의 이름이 헷갈리는 부분이 있어서 좀 찾아봤다. 자바 8이 꽤 대규모 릴리즈였는데, zulu의 자바 8의 릴리즈 버전은 1.8이라는 이름이 붙는다. 이는 초기 jdk의 버전 이름이 1.x 형식으로 붙여졌기 때문이고 결국 1.x는 java x 와 똑같은 버전이다. (java x형식의 이름은 5버전부터 사용됨)
1996년 출시되었고 안정화 버전인 JDK 1.0.2를 자바 1이라고 한다
이너 클래스, javabean, RMI, JDBC 추가
이너 클래스
다른 클래스 내부에 정의된 클래스
javabeans
컴포넌트 기반 sw 개발을 위한 규약이라고 생각하면 좋음.
- 자바 클래스로 구현
- 기본 생성자
- getter setter
- 이벤트 처리
- 기타 등등
RMI
java Remote Method Invocation)는 자바에서 원격 객체 간에 통신하기 위한 기술, 객체 지향성 특성을 그대로 활용할 수 있도록 지원함
Swing GUI, JIT, Collection Framework 등의 굵직한 기능이 추가됨. 2부터 약칭을 J2SE(Java 2 Standard Edition)로 표기하기 시작했으며, 이 표기는 5까지 사용됨
JIT
Java 언어는 일반적으로 소스 코드를 바이트 코드로 컴파일하고, 이를 JVM에서 해석하여 실행하지만, JIT 컴파일러는 프로그램을 실행하는 동안 바이트 코드를 네이티브 코드로 컴파일하여 직접 실행한다.
JPDA가 추가 됨
JPDA (Java Platform Debugger Architecture)
JPDA는 자바 애플리케이션의 디버깅 및 프로파일링을 가능하게 하며, 이는 주로 통합 개발 환경(IDE)에서 사용됨. IDE에서 제공되는 디버거는 JPDA를 기반으로 하여 자바 애플리케이션의 실행 흐름을 추적하고, 변수의 값을 검사하며, 중단점에서 프로그램의 실행을 일시 중지시키는 등의 기능을 수행함.
정규 표현식 추가, IPv6 지원, xml 파서
정규표현식
문자열을 다룰 때 일정한 패턴을 표현하는 언어 방식
ex) 개별 숫자 - /[0-9]/g : 0~9 사이 아무 숫자 에서 '하나' 찾음
처음 릴리즈 번호는 1.5 였지만 새로운 번호 체계 5를 쓰기 시작함
표기가 J2SE 에서 Java SE로 바뀜
오라클 인수 후에 첫 번째 버전임 많은 기능이 추가됨
(parameters) -> expression
기본 구조임
//기존 방식
MyFunctionalInterface square1 = new MyFunctionalInterface() {
@Override
public int square(int x) {
return x * x;
}
};
MyFunctionalInterface square2 = (x) -> x * x;
// 인터페이스 정의
interface MyFunctionalInterface {
int square(int x);
}
다르게 표현할 수 있게 됐음