[Java] JVM, JRE, JDK에 대해 알아보자!

Java에 대해서 1도 모르는 내가 Java 풀스택 개발자로 취업하게 되었다...

지금까지 데이터 엔지니어링에 대해서 공부했었는데, Java 풀스택 개발자로 취업하다니 세상 일은 알 수가 없다.

그래도 요즘 Kotlin 기반의 Spring을 많이 사용한다고 하니, Java를 배우는 것이 나중 커리어에 있어서도 큰 도움이 될 것이라 생각해 지금 열심히 공부하는 중이다...

6개월 간의 교육과 프로젝트를 수행한 후 취업을 하게 되는데, 현재는 교육기간으로 교육기간 동안 모르는 부분이나 공부한 부분에 대해서 차근차근 정리하려고 한다.

 

처음으로 Java의 JVM, JRE, JDK의 개념에 대해서 정리해보겠다.

JVM

JVM(Java Virtual Machine)이란 OS에 종속받지 않고, Java를 인식, 실행할 수 있게 하는 가상 컴퓨터이다. 

간단하게 이야기하면 ' 자바를 실행하기 위한 가상 기계(컴퓨터)' 라고 요약할 수 있다.

Java는 OS에 종속적이지 않다는 특징이 있는데, 이를 가능하게 만들어 주는 것이 JVM이다.

예를 들어 C 프로그램은 바로 기계어로 컴파일하므로 HW 기종에 맞게 컴파일되어야 한다. 이를 '플랫폼에 종속적'이라고 한다.

반면 Java 프로그램은 중간 단계 언어로 컴파일하여 JVM만 각 OS만 설치되어 있다면 HW 기종에 상관없이 단 한 번만 컴파일하면 된다. 이를 '플랫폼에 독립적'이라고 한다.

 

Java 소스코드(*.java 파일)는 실행을 위해 기계어로 컴파일을 해줘야하는데, 이 때 JVM 이라는 가상 머신을 거쳐서 OS에 도달하기 때문에 OS가 인식할 수 있는 기계어로 바로 컴파일 되는게 아니라 JVM이 인식할 수 있는 Java bytecode(*.class)로 변환( javac 명령어의 역할)된다.

  • 변환된 bytecode는 기계어가 아니기 때문에 OS에서 바로 실행되지 않는다.
  • JVM은 변환된 Byte Code 를 OS에 맞게 해석해주는 역할을 한다.
  • JVM의 이런 역할 덕분에 Byte Code는 JVM 위에서 OS 상관없이 실행될 수 있는 것이다.

JRE 

JRE(Java Runtime Enviroment)는 JVM이 자바 프로그램을 실행(동작)시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지이다.

컴파일된 자바 프로그램을 실행시킬 때 필요한 것들로, 단순히 자바 프로그램을 실행만 하려면 JRE만 다운받아 설치하면 된다.

  • EX) Java의 자료구조 기능들인 List, Map, Set 과 같은 것들…

JDK

하지만 우리는 Java 개발자(?) 아닌가, 단순히 Java를 실행하는 것에 그치지 않고 개발까지 하기 위해서는 JDK를 설치해야한다.

JDK(Java Development Kit)는 개발자들이 자바로 개발하는 데 사용되는 SDK 키트라 생각하면 된다. 

자바 코드를 컴파일할 때 쓰는 javac, 자바를 디버깅할 때 쓰는 jdb, 서로 연관 있는 클래스들을 하나의 JAR파일로 묶어주는 jar 등 Java 개발자들을 위한 기능들도 같이 탑재를 하고 있는 것이 JDK이다. 개발을 하려면 자바 프로그램을 실행도 시켜줘야 하기 때문에 JRE(Java Runtime Environment)도 함께 포함되어 있다.

 

정리

  • JVM : Java 프로그램이 os에 종속적이지 않게 Virtual Machine을 os에 따로 띄어서 진행하는 실행 주체의 역할
  • JRE : Java로 작성되어 빌드까지 완료한 프로그램을 실행하기 위해서 있어야 하는 것들
  • JDK : 개발을 위한 SDK Kit으로 개발에 필요한 것! (JRE도 포함)