JDK, JRE, JVM

청승 맞게 불꺼 놓고 이불을 머리 끝까지 덮어 놓고 베게 위에 얼굴 엎어 놓고 샤워하고 싶은 웅쓰입니다.
왜이렇게 모르는게 많을까요!!!
배우긴 했지만 누구에게 설명할 정도로 알지 못하는 JDK, JRE, JVM에 대해서 한번 정리하는 시간을 가져보고자 합니다.
목차
- JDK, JRE, JVM
1. JDK, JRE, JVM
JDK, JRE, JVM은 어쨌든 자바라는 프로그래밍 언어를 컴퓨터가 이해할 수 있도록 가공을 한 후 코드 실행을 도와주는 것들이다. 고로, 자바가 어떤 프로세스로 실행이 되는지 대충 흐름을 파악할 필요가 있다. 흐름을 이해한다면 어디서 무엇이 쓰이는지 이해하는데 도움이 될 것이다.

우리가 일반적으로 자바 코드를 작성하고 실행하면 위와 같은 프로세스를 거친다. 자바코드가 JVM이 읽을 수 있는 바이트코드로 변환되고 최종적으로는 기계어로 CPU에 전달되고 실행이 되는 과정이다. 이 과정속에서 javac명령어, java명령어, 인터프리터 등 다양한 것들이 나오는데, 이들은 JDK, JRE, JVM 중 어디에 속해서 실행되는 것인지 정리해보자!
(개인적으로 java 실행 프로세스를 간소화했지만 잘 만든 것 같아서 좋게 봐주시면 감사하겠습니다.... 꾸벅_._....)
구조를 먼저 그려놓고 시작하겠다.

(너무 대충 그린 것 같아 보이네요... 양해 오네가이시마스....)
(1). JDK(Java Development Kit)
이름과 같이 자바 개발 도구로써 javac, java와 같은 명령어를 가지고 있고 JRE를 포함한다. 여기서 javac 명령어는 java파일을 class파일(바이트코드)로 컴파일 해주는 명령어이고, java 명령어는 jvm을 실행시켜주는 명령어다. class파일로 컴파일을 해주는 javac 명령어를 JDK가 가지고 있기 때문에 JDK 버전이 다르면 자바의 문법 사용 가능 여부가 달라진다.(ex, 람다식은 JDK 8버전 부터 사용가능)
컴파일 명령어도 있고 jre 등 java를 구동하는데 필요한 모든 것을 가지고 있는 JDK를 필자는 "자바 종합 선물 세트"라고 표현하고 기억할 것이다. JDK를 다운로드 받으면 자바를 구동하는데 필요한 필수적인 것들은 모두 다운로드 받을 수 있다. 자, 그럼 선물 세트의 구성품인 jre를 정리해보자.
(2). JRE(Java Runtime Environment)
자바 실행 환경에 관련된 내용을 가지고 있는 패키지다. 이렇게 표현하면 솔직히 이해가 잘 안간다. 필자는 그냥 "자바 표준 라이브러리 + jvm런처(java) + JVM = JRE"로 간단하게 정리할 것이다. 자바 표준 라이브러리는 java.lang.*, java.util.* 등의 자바에서 기본으로 사용되는 표준 라이브러리들이다. JRE가 다르면 사용할 수 있는 Java 표준 라이브러리가 다를 수 있다.(일반적으로 같은 JDK를 사용하면 같은 JRE를 사용하는 것이기에 JDK 버전만 맞춰주면 된다.)
jvm런처는 사실 JDK에 속한 java 명령어와 같은 것이다. JDK의 java, JRE의 java 명령어 중 어느것을 사용해도 JVM을 실행시키며 Path 설정에 의해서 어떤 java 명령어가 실행될지 결정된다. 그리고 JVM은 뭘까?
(3). JVM(Java Virtual Machine)
JVM은 JRE에 속해 있으며 바이트코드를 실행하는 가상 머신이다. JVM은 바이트코드를 실행하고 OS, 하드웨어 위에서 동작을 한다는 특성이 있는데, 이 특성 덕분에 자바로 작성된 프로그램이 어떤 운영체제에서도 모두 실행될 수 있다. 자바코드를 바이트코드로만 만들면 그 이후에는 JVM이 OS에 맞게 처리해주기 때문이다. 이는 또 반대로 말하면 JVM은 OS에 종속이 된다는 것이고 사용하는 OS에 맞는 JVM을 설치해야 한다는 말이기도 하다.(java -> 플랫폼 독립성, JVM -> 플랫폼 종속성)

JVM은 위와 같은 구조다. 바이트코드(class파일)을 처리하는 프로세스를 구조화시켜 놓은 모습이다. Garbage Collector, Heap 메모리 등 다양한 기능을 하는 영역이 존재하지만 이는 다음에 JVM만 집중적으로 한번 정리해 보도록 하고, 자바코드를 실행하는 흐름도에 나와있는 부분만 살펴보면 Execution Engine인 Interpreter, JIT Compiler가 JVM 내부적으로 동작한다는 것을 확인할 수 있다.