JDK(Java Development Kit)
JDK는 Java Development Kit의 약자로 자바로 개발하는데 있어 필요한 SDK라고 생각하시면 됩니다.
그래서 JDK에는 자바 개발에 있어서 필요한 개발 도구들(java, javac, javap, javadoc...)과 이어서 설명할 실행에 있어 필요한 JRE(Java Runtime Enviroment)를 포함합니다.
SDK란?
SDK(Software Development Kit)란, 개발자를 위한 플랫폼별 구축 도구 세트입니다. 특정 플랫폼, 운영 체제 또는 프로그래밍 언어에서 실행되는 코드를 만들려면 디버거, 컴파일러 및 라이브러리와 같은 구성 요소가 필요합니다. SDK는 소프트웨어를 개발하고 실행하는 데 필요한 모든 것을 한 곳에서 제공합니다. 또한 SDK에는 문서, 튜토리얼 및 가이드와 같은 리소스와 더 빠른 애플리케이션 개발을 위한 API 및 프레임워크가 포함됩니다.
JDK 종류
JDK는 오라클의 Java SE(Java Standard Edition), Java ME(Java Micro Edition) 2개의 버전과
이클립스 제단의 Jakarta EE(Jakarta Enterprise Edition)가 있습니다.
이 모든 버전은 과거 썬 마이크로시스템즈가 각각 J2SE, J2ME, J2EE라는 이름으로 시작하여 개발하였습니다. 2010년 오라클이 썬을 인수했고 2017년 오라클이 이클립스 제단에 Java EE 8릴리즈를 마지막으로 이관하였고 공식 명칭 Jakarta EE, 프로젝트명 EE4J(Eclipse Enterprise for Java)로 운영해오고 있습니다.
자바 11버전 같이 일반적으로 말하는 버전은 오라클의 Java SE의 메이저 버전입니다.
Oracle JDK는 NFTC라이센스를 적용하고 있습니다. 때문에 기업에서 사용 할때에는 유료로 사용합니다. 그러나 여러 회사들이 JDK를 만들고 있고 그중 많이 쓰는 것을 다음과 같고 사용하실때에 라이센스를 확인하고 사용하시기 바랍니다.
이름 | 개발사 |
Oracle JDK | Oracle |
Open JDK | Oracle |
Amazon Corretto | Amazon |
Temurin (AdoptOpenJDK) | Eclipse |
JRE(Java Runtime Enviroment)
JRE는 Java Runtime Enviroment의 약자로 컴퓨터의 운영체제 소프트웨어 상에서 실행되고 클래스 라이브러리 및 특정 Java 프로그램이 실행해야 하는 기타 리소스를 제공하는 소프트웨어 계층입니다.
JRE는 기본적으로 JDK에 포함되어 있으며, 기존에는 개별적으로 설치가 가능했지만 JDK11 버전부터는 따로 제공되지 않습니다.
JVM(Java Virtual Machine)
JVM은 Java Virtual Machine의 약자로 한국어로는 자바 가상 머신이라고 하며 OS를 가상화 하여 실행하는 Virtual Machine처럼 Java로 작성된 소프트웨어를 가상화 하여 하드웨어에 족속적이지 않게 실행 할 수 있도록 해주는 미들웨어 소프트웨어입니다.
왜 JVM이 필요한가?
C언어의 실행(WOCA)
JVM의 필요성을 알기 위해 C언어의 컴파일 방식을 먼저 알아 보겠습니다.
C언어는 컴파일을 하게 되면 그 결과물로 즉시 실행 가능한 응용프로그램 파일을 반환하게 됩니다.
이렇게 반환된 별과물을 Binary code라고 하며 이는 OS와 CPU에 종속적이게에 MAC OS를 위해 컴파일 되면 Linux, Windows에서, ARM을 위해 컴파일 되면 Risc-V, MIPS, X86에서 사용이 불가능 하기에 각각의 환경에 맞는 컴파일러로 다시 컴파일을 해야 합니다.
이러한 C언어의 컴파일 방식을 WOCA, Write Once, Compile Anywhere, 번역하면 "한번 작성하고 컴파일하면 어디서든 사용가능하다"이고 여기서 어디서든의 의미는 환경이 동일한 곳이면 어디든이라는 의미입니다. 때문에 C언어를 이식성이 낮다고 합니다.
Binary code란?
한국어로 이진 코드라고 하며, 컴퓨터가 직접 이해하고 실행할 수 있는 언어로, 0과 1로만 구성된 코드를 말합니다. 이는 소프트웨어 또는 프로그램이 컴퓨터의 프로세서에 의해 직접 실행될 수 있게 하는 최종적인 형태입니다. 컴파일러나 어셈블러는 고수준 언어나 어셈블리 언어를 이진 코드로 변환하여, 컴퓨터가 실행할 수 있게 합니다. 이진 코드는 특정 하드웨어 아키텍처에 특화되어 있어 다른 하드웨어에서는 실행이 어려울 수 있습니다. Machine Code(기계어)역시 Binary code의 일종입니다.
Java의 실행(WORA)
앞서 살펴본 C언어와 달리 Java는 컴파일 하면 그 결과물로 Byte Code를 반환해 줍니다. 그리고 이 Byte Code가 실행되기 위해 JVM을 거쳐 실행이 되며, JVM이 각각의 하드웨어에 맞는 Binary code로 바꾸어 실행을 시키기 때문에 실행 속도가 느리다는 단점도 존재 하지만 하드웨어, OS에 대해 독립적으로 작동 할 수 있습니다.
Byte Code란?
바이트 코드는 일반적으로 컴파일러나 인터프리터에 의해 소스 코드가 중간 단계의 코드로 변환된 것을 말합니다. 바이트 코드는 하드웨어에 독립적이기 때문에 여러 운영 체제에서 호환될 수 있는 큰 장점이 있습니다.
조금 더 자세하게 Java의 실행 과정을 살펴 보겠습니다.
1. Java로 작성된 Source Code를 javac 라는 Java Compiler합니다.
2. 컴파일 결과물인 .class 확장자의 Byte Code를 JVM인 java로 실행 시키면 각 환경에 맞는 Binary code로 바꾸어 실행됩니다.
이러한 Java의 컴파일 방식을 WORA, Write Once, Read Anywhere, 번역하면 "한번 작성하면 어디서든 읽을수 있다"이고 여기서 읽다의 주체는 JVM을 말합니다. 때문에 Java를 이식성이 높다고 합니다.
때문에 JVM은 Java뿐 아니라 Kotlin, Groovy, Closure등의 언어들 역시 사용라고 있습니다.
그런데, 이렇게 C언어 보다 한층 진보한 언어로 보여지는 Java를 두고 왜 여전히 C, C++등의 고전적인 방식의 컴파일을 하는 언어를 사용할까요? 레거시라서? 개발자들이 멍청해서? 당연히 아닙니다. 이로 인한 비효율과 문제점들이 있기에 고전적인 방식의 컴파일을 여전히 사용 하는 것 입니다.
Java는 두번의 컴파일을 하기에 속도의 문제가 발생하는데, 이를 보완하기 위해 내부적으로 JIT Compiler(Just-In-Time compiler)를 사용해서 필요한 부분만을 Binary code로 바꾸어 줌으로써 성능 향상을 가져오도록 했지만 그럼에도 C언어의 실행 속도를 따라잡지는 못합니다. 때문에 게임에서 C++, C#을 주로 사용하고, 임베디드에서 C, C++을 사용하는 이유가 이렇게 무겁게 JVM + 소프트웨어를 띄워야하고 속도도 느린 단점이 있기 때문 입니다.
Java 실행 실습
1. Java문법에 맞게 Java Source Code를 작성해 줍니다.
2. Javac로 컴파일 하여 Byte Code로 컴파일 합니다.
3. Java로 실행 하여 Binary code로 변환되어 실행되도록 합니다.
출처
https://www.ibm.com/kr-ko/topics/java
https://www.ibm.com/kr-ko/topics/jre
https://aws.amazon.com/ko/what-is/java-runtime-environment/
https://www.ibm.com/docs/ko/sdk-java-technology/8?topic=introduction-java-virtual-machine