참고 포스팅
JDK는 자바 개발 키트의 약자로 개발자들이 자바 애플리케이션을 개발하는데 사용되는 SDK 라고 생각하면 됩니다.
SDK
: 소프트웨어 개발 도구, 개발자를 위한 플랫폼별 구축 도구 세트입니다.
다음 그림에서 알 수 있듯이 JDK 안에는 JVM, JRE 뿐만 아니라 자바를 개발하는데 필요한 development tools도 함께 포함하고 있습니다.
자바의 버전을 표현할 때에는 보통 JDK 또는 Java SE 버전으로 나타냅니다.
초기 버전인 1.0/1.1 버전에서는 JDK 1.0/ JDK1.2 이런 방식으로 버전을 명시했지만, JDK 1.2를 발표하면서 J2SE로 변경, 2006년 JDK 1.6부터 Java SE(Standard Edition)으로 변경되었습니다.
실제로 공식 사이트에 JDK 다운로드 페이지에 아래와 같이 Java 버전이 표기되어 있습니다.
가장 기본이 되는 표준 에디션의 자바 플랫폼으로 자바 언어의 핵심기능을 제공
대규모 기업용 에디션. SE 확장판(대형 네트워크 환경 프로그램 개발 시)
피쳐폰, 셉톱박스, 프린터와 같은 작은 임베디드 기기들을 다루는데 이용하는 에디션.
가볍고 예쁜 그래픽 사용자 인터페이스를 제공하는 에디션
정리하면, JAVA 11이라고 하는 것은 JDK 버전을 의미합니다. 즉, 자바 설치는 곧 JDK 설치와 같습니다.
리눅스에 Ubuntu, CentOS, RedHat 계열이 나뉘듯이 자바(JDK)도 여러 종류가 있습니다.
JDK의 종류가 여러가지로 나뉘는 이유는 라이센스(저작권) 때문입니다.
Java 소스코드 자체는 오픈소스입니다.
그래서 오픈소스인 Java 소스코드를 빌드하여 사용하는 것에는 거의 제약이 없지만 Oracle에서 제공하는 설치버전의 JDK에는 위의 NFTC(No-Fee Terms And Conditions) 라이센스가 적용되어 회사에서는 무료로 사용이 불가능합니다.
위처럼 많은 JDK 종류들이 있지만, 주요한 JDK들은 다음과 같습니다.
Native Code
: 특정 유형의 프로세서(CPU) 나 하드웨어 플랫폼에서 직접 실행되도록 설계된 컴퓨터 프로그래밍 코드. (해당 플랫폼에서만 사용되기 때문에 성능이 좋음.)
JRE는 자바실행환경의 약자로써, JVM과 자바프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지입니다. 이외에도 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일(jar 파일)을 가지고 있습니다.
JRE는 기본적으로 JDK에 포함되어 있기 때문에 JDK를 설치하면 함께 설치됩니다.
기존에는 개별적으로 설치가 가능했지만 JDK 11 버전 부터는 따로 제공되지 않습니다.
간단하게 정리하면, Java로 프로그램을 직접 개발하기 위해서는 JDK가 필요하고, 개발된 프로그램을 실행시키기 위해서는 JRE가 필요합니다.
자바 가상 머신의 약자로써, 자바 프로그램을 실행시키는 프로그램 정도로 이해하면 됩니다.
JAVA라는 언어가 인기를 얻게된 핵심 이유 중 하나가 JVM 개념입니다.
JVM을 사용하면, 자바 프로그램을 OS 플랫폼에 의존하지 않고 어떤 환경에서도 동작이 가능하다는 점이 핵심입니다.
아래에 이에 자세한 내용에 대해 설명하겠습니다.
Java는 특정 OS에 종속되지 않는다는 특징을 가지고 있습니다.
특정 OS에 종속되지 않고 실행되기 위해서는 OS 위에서 Java를 실행시킬 무언가가 필요한데 그 역할을 하는 것이 JVM 입니다.
위 특징을 쉽게 설명할 수 있는 예시로 'C언어' 와 'java'를 비교하는 것입니다.
C언어는 WOCA(Wirte Once Compile Anywhere) 라는 특성을 갖습니다. 이는 개발자가 작성한 소스 코드를 컴파일러에 의해 기계가 이해하는 기계어로 변환되어 실행해주는 프로그램(exe)을 만들어 주는 것을 의미합니다.
이 때, 컴파일된 코드를 바이너리 코드(이진 코드, 기계어)라고 부릅니다.
즉, Write Once, Compile Anywhere : 한번만 작성하고 컴파일하면 어디서든 사용이 가능하다는 의미입니다.
그러나 번역된 바이너리 코드는 특정 OS나 CPU 구조에 맞게 설계된 컴파일러에 의해 OS마다 다르게 컴파일 된다는 특징이 있습니다.
이 말은, 주어진 환경에 따라서 다른 바이너리 코드를 컴파일하고 다른 환경에서는 이 바이너리 코드를 이해할 수 없다는 것을 의미합니다.
이를 다른 말로 "이식성이 낮다" 라고 표현합니다.
위와 같은 C언어의 OS에 종속적인 문제를 해결하기 위해서 JAVA(JVM)이 등장하게 됩니다.
JAVA 언어로 작성한 소스파일은 직접 운영체제로 가서 실행하는 것이 아닌, JVM을 거쳐서 운영체제와 상호작용하게 됩니다.
이 말의 의미는 JVM이 있다면, 운영체제에 상관없이 프로그램을 어디서든 실행시킬 수 있다는 것을 의미합니다.
즉, Write Once, Run Anywhere : 한번만 작성하면 어디서든 실행시킬 수 있다는 것을 의미합니다.
이것이 가능한 이유는 컴파일된 코드와 하드웨어/ OS 사이 중간에서 JVM이 각 환경에 맞게 Byte Code로 변환시켜주기 때문입니다.
즉, 재컴파일할 필요 없이 바로 기계가 읽고 실행할 수 있게 됩니다.
이를 다른 말로 "이식성이 높다." 고 합니다.
정리하면, C언어는 컴파일 과정에서 소스 코드를 Binary Code(기계어)로 바로 변환하여 하드웨어에 의해 읽어지고, 이러한 이유로 OS에 종속적인 언어가 됐습니다. 이와 달리, Java는 다음의 과정을 통해 OS에 종속적이지 않게 됐습니다.
Java Compiler가 Java로 작성된 소스 코드(.java) 파일을 .class 파일인 Byte Code로 컴파일 한다.( 단, 바이트 코드는 CPU에서 직접 동작이 불가능한 코드로써, JVM만 이해 가능한 코드를 말합니다.)
이제 이 Byte Code를 기계어로 변환시키기 위해 가상 CPU가 필요한데, 이걱이 JVM의 역할 입니다.
OS마다 다른 JVM이 존재하여 동일한 Byte Code를 OS에 맞게 바이너리 코드(기계어)로 변환시켜줍니다.
이러한 바이너리 코드가 CPU에서 실행되어 사용자에게 서비스를 제공하게 됩니다.
Byte Code
: 가상 머신(JVM, CLR 등)에서 사용되는 코드 개념으로, 가상 머신이 이해할 수 있는 중간 레벨로 컴파일한 코드를 말합니다.
자바 프로그램은 JVM에 의해 컴파일 단계를 한번 더 거쳐야 하기 때문에, 상대적으로 실행 속도가 느리다는 단점이 있습니다.
이를 보완하기 위해 JIT 컴파일러라는 내부 프로그램을 사용하여 필요한 부분만을 기계어로 바꾸어 줌으로써 성능 향상을 가져오도록 했지만, 그럼에도 불구하고 속도 측면에서는 C언어의 실행 속도가 더 높습니다.
JIT 컴파일러(Just-In-Time Compiler)
란?
기존의 자바는 인터프리터 방식으로 명령어를 하나씩 실행하게끔 이뤄져 있어 실행 속도가 느렸습니다. 하지만 하드웨어가 발전하면서 자바 실행엔진이 JIT 컴파일러 방식으로 개선됐습니다.
JIT 컴파일러는 동일한 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱합니다. 이 후 바뀐 부분만 컴파일 하고 나머지 코드는 캐싱 저장소에서 가져와 사용하도록 합니다.
동적 번역(Dynamic Translation) 이라고도 불리는 이 기법은 이전의 인터프리팅 방식보다 10~20배 정도 성능이 좋습니다.