java

[Java] Java 용어들을 알아보자. (JRE, JDK, JVM)

inhooo00 2025. 2. 1. 16:41

📍개요

카카오 탐방 중 JVM과 GC와 같은 Java의 기본적인 원리가 무엇인지 설명할 수 있느냐는 질문에 말문이 막혔다.
자바 파일을 운영체제 상관없이 사용하게 도와주는 프로그램이라는 것만 알고 그 이상 설명할 수 없었던 나 자신에게 충격받고, 기본적인 내용을 다시 한 번 정리해보려 한다.

 

 

 

📍JVM(java virtual machine)이 무엇일까?

컴퓨터들은 모두 같은 기계어를 쓰는 게 아니다.

C언어로 짜서 컴파일한 기계어인데 윈도우에서 돌아가게 컴파일한 것은 맥이나 리눅스에서는 안 도는 현상이 발생한다.

그럼 어떻게 해야할까? 프로그램이 돌 환경을 생각해서 그 환경에 맞도록 기계어를 번역해줘야 한다. 그렇게 매우 번거롭다.

이런 문제를 해결하기 위해 만들어진 게 자바의 JVM이다.

쉽게 말하자면 각 종류에 컴퓨터에 JVM이라는 전담 통역 센터가 있다고 생각하면 된다.

우리가 자바로 코딩을 하고 나서 컴파일을 하면 기계어가 아닌 바이트코드란 게 생긴다.

사람이 쓴 코드와 컴퓨터가 읽는 코드의 중간 단계라고 생각하면 된다.

우리가 Hello.java를 작성하고 나서 터미널과 같은 환경에서 javac(자바 컴파일러)가 javac Hello.java 명령을 내리게 된다면 같은 위치에 Hello.class가 만들어진다.
이 Hello.class가 바이트코드다.

 

그래서 이 바이트 코드를(.class) 실행할 컴퓨터에 깔려있는 JVM에 가져다주면 그 컴퓨터를 이 프로그램을 실행할 때, 바이트코드를 그 때 그 때 기계어로 통역을 해주는 것이다.

이렇게 바이트코드를 쓴다는 점에서 부수적으로 나오는 장점이 무엇이냐면, 자바 뿐만 아니라 Groovy나 Scala, Kotlin과 같은 코드도 똑같이 JVM을 돌리는 바이트코드로 컴파일이 된다는 것이다.

 

 

 

📍JRE(java runtime environment)가 무엇일까?

이 단어에서 집중해서 보아야할 부분이 runtime이다. 

runtime은 compile time이랑 대조되는 말이다. compile이라는 건 번역 작업, 즉 코딩 다하고 실행하거나 배포하기 전에 미리해두는 번역 작업이다. 이걸 하는 시점을 compile time이라고 하는 것이다.

반대로 runtime은 실행하는 시점을 말한다.

JRE는 자바로 짠 소프트웨어가 컴파일 및 빌드까지 다 된 다음 이를 사용할 곳에 주어져서 실행이 될 때, 그 환경 요소들로서 필요한 것들인 것이다.

소프트웨어란 것이 우리가 작성한 자바 언어로만 실행되는 것은 아니다. 예를 들어 List,Map 같은 기능들도 우리가 일일이 구현한 것이 아닌, 바이트코드로 컴파일된 클래스로 제공이 되기 때문이다.

그래서 이처럼 널리 쓰이는, 또 JVM에서 도는 라이브러리들을 세트로 묶어다가 다운받아 설치할 수 있도록 한게 JRE인 것이다.

(우리가 항상 보는 인텔리제이 안에서 커피잔 모양이 JRE 문제인 것..)

 

 

📍JDK(java development kit)가 무엇일까?

말 그대로 자바 개발 도구란 뜻이다.

JRE가 JVM을 포함하는 것처럼, JDK도 JRE를 포함하는 것이다. 즉, JDK안에 JRE안에 JVM인 구조.

추가적으로 JDK에는 
1. 자바 코드를 컴파일할 때 쓰는 javac
2. 자바를 디버깅할 때 쓰는 jdb
3. 서로 연관 있는 클래스들을 하나의 JAR 파일로 묶어주는 jar
와 같이 다양한 항목이 포함되어 있다.

우리가 항상 자바 버전 문제로 겪는 이슈가 이 JDK에서 발생한다. (버전 이슈)

Oracle JDK나 Amazon의 Coretto 등등..

 

 

📍결론

대충 알고 있던 자바 관련 개념을 정리해 보았다.
배포 환경에서 JDK 오류를 만날 때마다, 단순히 자바 버전 문제라고 생각했었는데, 그 안에 JRE나 JVM도 연관되어 있다는 사실은 몰랐었다..
jar도 어디서 생성되었나 했었는데 JDK가 제공해 준다는 사실도 새롭게 알게 되었다. 
다음에 배포할 때는 아는 내용이 많아져서 더 재밌을 거 같다.😇

'java' 카테고리의 다른 글

[Java] 람다가 필요한 이유와 생략 규칙  (0) 2025.04.07
[Java] 튜닝의 마지막 단계 GC 알아보기  (0) 2025.02.05