[Java] JDK(개발도구), JRE(실행환경), JVM(가상머신)
자바언어의 특징인 WORA와 자바로 작성된 프로그램을 뒷바침하는 도구들(JDK,JRE,JVM)을 살펴보자.
1. 자바의 WORA(Write Once Run Anywhere)
C언어의 특징을 먼저 살펴보자.
C언어로 작성된 프로그램은 플랫폼에 종속적이다.
예를 들어, Intel CPU + Windows OS
환경에서 작성한 C 프로그램은 해당 환경에서만 실행이 가능하다. 즉, Intel CPU + MAC OS
또는 AMD CPU + Windows OS
등의 환경에서는 실행되지 않는다는 것이다.
C로 작성된 프로그램이 호환성이 없는 이유는 다음과 같다.
-
CPU(Central Processing Unit, 중앙처리장치)마다 기계어가 다름
- 기계어는 Java나 Python처럼 통일된 문법을 가진 언어가 아니다.
- CPU 제조사마다 자사의 CPU가 이해할 수 있는 기계어의 규칙이 다르다.
- 즉 다양한 CPU환경에서 프로그램 A를 실행하기 위해서, 각 CPU 제조사의 기계어로 번역 가능한 A를 개발해야 한다.
- OS마다 API가 다름
-
OS마다 실행파일 형식이 다름
카카오톡으로 예를 들어보자.
유저가 생각하는 카카오톡은 1개이다. 하지만 다양한 CPU와 OS가 있고, 각 환경에서 실행 가능한 카카오톡 프로그램이 필요하다. 실행환경이 총 10개라면, 10개의 서로 다른 카카오톡 프로그램을 개발해야 하는 것이다.
이와 같이 프로그램이 플랫폼에 종속적이라는 문제를 해결하며 등장한 언어가 자바이다.
자바는 JVM
와 Byte code
를 이용하여, 자바로 작성한 프로그램이 어떤 하드웨어나 운영체제에서도 동작할 수 있게 하였다(플랫폼 독립적). 이러한 자바언어의 특징을 WORA(Write Once Run Anywhere, 한번 작성하면 어디서든 동작한다)라 일컫는다.
자바의 WORA
- java로 쓰여진 소스코드(
.java
)를 작성했다고 가정해보자. - Java 컴파일러인
javac.exe
가 해당 소스코드를 Byte Code(.class
)로 컴파일한다. - 이 때 컴파일된 Byte Code(
.class
)는 CPU가 이해할 수 있는 기계어가 아니라, 가상머신이 이해할 수 있는 형태로 번역된 것이다. - Byte Code(
.class
)는 JVM(자바가상머신)에 의해서 해석되고 실행된다. - 이 때 JVM이 실행되는 플랫폼마다 다른 형태로 존재하며, 따라서 실행될 환경에 맞게 Byte Code(
.class
)를 인터프리팅하여 실행시킨다.
2. JDK, JRE, JVM
JDK, JRE, JVM은 다음과 같은 관계를 가지고 있다.
JDK ⊃ JRE ⊃ JVM
source : catch-me-java.tistory.com
2-1) JDK(Java Development Kit) : 컴파일러, 역 어셈블러, 디버거, 의존관계 분석 등 개발에 필요한 도구를 제공한다. 즉, 소스코드를 JVM이 읽을 수 있는 형태로 변경해준다.
-
javac.exe
: 자바 컴파일러 -
javap.exe
: 디스어셈블 도구 -
jar.exe
서로 관련있는 클래스 라이브러 리들과 리소스를 하나의 JAR 파일로 묶는 도구 -jdb.exe
: 자바 디버깅 도구
2-2) JRE(Java Runtime Environment) : JVM이 원활하게 작동할 수 있도록 환경을 맞춰주는 역할을 한다. 클래스로더와 클래스 라이브러리를 통해 작성된 코드를 라이브러리와 결합한 후 JVM에 넘긴다. 개발과 관련된 도구는 포함하지 않는다.
-
java.exe
: 자바 응용 프로그램 로더. javac 컴파일러가 만든 클래스 파일을 해석 및 실행 Class Loader
2-3) JVM(Java Virtual Machine) : 플랫폼에 독립적으로 실행될 수 있는 추상층을 제공한다. 즉, 바이트코드를 OS에 맞추어 변경해주는데 이 때 사용하는 것이 인터프리터와 JIT이다.
-
Interpreter
: 바이트코드를 읽고 해석 -
JIT(Just In Time) Compiler
: 런타임에 기계어로 번역해주는 컴파일러. 동적 번역(Dynamic translation)이라고도 불리는 기법. 프로그램 실행 속도 향상을 위해 개발
요약
JDK | JRE | JVM |
---|---|---|
개발에 필요한 툴 | 자바 클래스와 라이브러리, 필수 컴포넌트 제공 | 바이트코드 실행, 실행에 필요한 환경 제공 |
플랫폼 독립적 | 플랫폼 독립적 | 플랫폼 종속적 |
References
- https://zitto15.tistory.com/40
- http://www.tcpschool.com/java/java_intro_basic
- https://sowhat4.tistory.com/61
- https://m.blog.naver.com/duqrlwjddns1/221770110714
- https://catch-me-java.tistory.com/11?category=438116
댓글남기기