본문 바로가기
Java/About Java

[Java] JDK, JVM, JRE

by seaweed_one 2022. 12. 27.
728x90

JDK는 JVM, JRE는 자바 프로그래밍에 사용되는 3대 핵심 기술 패키지입니다.
세 가지 기술의 개념과 연관성 그리고 차이점을 알아보려고 합니다.

JVM

JVM 이란?

JVM 은 Java Virtural Machine의 약자입니다.
직역하면 '자바를 실행하기 위한 가상 기계'라고 말할 수 있습니다.
영어권에서는 컴퓨터를 머신이라고도 부르기 때문에 '자바 실행을 위한 가상 컴퓨터'라고 볼 수 도 있겠네요.
먼저 Virtural Machine의 개념을 잠시 알아보고 가겠습니다.

가상 머신이란 무엇일까요?
가상머신은 소프트웨어로 구현된 하드웨어를 뜻하는 넓은 의미의 용어입니다.
우리가 PC에 가상머신을 설치한다면 컴퓨터 안에 컴퓨터가 존재한다고 생각할 수 있습니다.

자바로 작성된 애플리케이션은 모두 자바가상머신인 JVM에서만 실행되기 때문에 자바 애플리케이션 실행을 위해서는 반드시 JVM이 필요합니다.
일반 애플리케이션 내의 코드는 OS만을 거쳐 하드웨어로 전달되지만 Java 애플리케이션은 JVM을 한번 더 거치게 되는 것이죠. 해서 하드웨어에 맞게 완전히 컴파일된 상태가 아니므로 속도가 느리다는 단점을 가지고 있습니다.
하지만 요즘엔 바이트코드 (컴파일된 자바코드)를 하드웨어의 기계어로 바로 변환해주는 JIT 컴파일러와 향상된 기술 적용으로 속도의 격차가 많이 줄었습니다.
그럼 JVM 이 OS에 독립적일 수 있는 이유를 알아보겠습니다.

JVM과 OS

위에서 잠시 이야기한 것처럼 일반 애플리케이션은 OS와 바로 맞붙어 있기 때문에 OS 종속적입니다.
해서 같은 코드를 다른 OS에서 실행시키기 위해서는 애플리케이션을 해당 운영체제에 맞게 변경해야 하죠.

OS에 종속되지 않고 실행할 수 있는 방법이 있을까요?
바로 JVM입니다.
자바 애플리케이션은 JVM 하고만 상호작용을 하기 때문에 OS와 하드웨어에 독립적이고 서로 다른 OS에서도 프로그램의 변경 없이 실행이 가능합니다.

JVM 은 어떻게 자바를 서로 다른 OS에서 돌아가게 하는 걸까요?
Java로 작성한 소스코드 (.java 로 이뤄진 소스코드)는 CPU 가 인식하지 못합니다.
JVM 이 없다면 바로 OS에 도달하기 때문에 OS 가 인식할 수 있는 기계어로 바로 컴파일이 필요하겠죠.
하지만 Java는 JVM을 거쳐 OS에 도달하기 때문에 기계어로 컴파일되는 대신 Java compiler를 이용하여 JVM이 인식할 수 있는 Java bytecode로 변환됩니다.
Java bytecode라고 하니 막상 와닿지 않으실 수도 있지만 .class 파일이라고 생각하시면 됩니다.
JVM 은 해당 bytecode를 OS 가 이해할 수 있도록 해석해 줍니다. 해서 bytecode는 JVM 위에서 OS와 상관없이 실행될 수 있습니다.
해서 자바의 주요 장점 중 하나인 "Wirte once , run anywhere." 이 가능한 것입니다.

단 JVM은 OS에 종속적이기 때문에 해당 OS에서 실행 가능한 JVM 이 존재하여야 합니다.
즉 리눅스의 JVM과 윈도우즈의 JVM은 다릅니다.
썬에서는 일반적으로 많이 사용되는 주요 OS 용 JVM을 제공합니다.

JVM의 역할

JVM은 다음과 같은 역할을 합니다.

  • 바이너리 코드 읽기
  • 바이너리 코드 검증
  • 바이너리 코드 실행
  • 필요 라이브러리 및 파일 등 실행환경(Runtime Environment)의 규격 제공

JVM은 위에서 알아본 바와 같이 프로그램 실행을 위한 플랫폼 구성요소인데요.
가장 큰 역할은 자바 소스코드로부터 만들어지는 자바 바이너리 파일(.class)을 실행할 수 있다는 것입니다.
컴파일된 바이너리 코드는 어떤 JVM에서도 동작시킬 수 있습니다.
JRE는 자바 프로그램 구동을 위해 독립적으로 사용할 수도 있지만 JDK의 일부이기도 합니다.

JVM 의 구조나 동작 원리에 대하여 더 궁금하시다면 아래의 포스팅을 참고하셔도 좋을 것 같습니다.

Java Memory

이번 포스팅에서는 자바의 메모리 영역에 대하여 알아보겠습니다. 본격적으로 알아보기에 앞서 왜 메모리 영역을 알아야 하는 걸까요? 자바에는 가비지 컬렉터(Garbage Collector)가 존재하여 사용

seaweed-one.tistory.com

JRE

JRE 란?

Java Runtime Environment의 약자입니다.
직역하자면 자바 런타임 환경을 의미하죠.
자바 런타임 환경?
조금 추상적이시라면 자바로 작성된 응용프로그램이 실행되기 위한 최소환경으로 이해할 수 있습니다.

JDK가 자바 소프트웨어 개발을 위한 도구로 이뤄진 패키지인 반면 JRE는 자바 코드 실행을 위한 도구들로 이루어져 있죠.
해서 JAVA로 작성된 프로그램 실행을 위해선 JRE가 필요합니다.

JRE만으로는 자바로 개발은 불가능합니다.
개발을 위해 만들어지지 않았기 때문에 프로그램 개발에 JRE를 사용하면 문제가 생길 수 있습니다.
예를 들어 컴파일이 정상적으로 되지 않는 경우가 발생할 수도 있죠.
하지만 실행은 가능하므로 JAVA 프로그램 실행만 하시는 경우라면 JRE만 설치하면 됩니다.

구성요소

JRE = JVM + 클래스 라이브러리 ( Java API)
보통 사용자 입장에서 JAVA를 설치한다는 것은 JRE를 설치하는 것을 말하는데 JRE는 JVM을 생성하는 디스크상의 부분으로 JVM, Java 클래스 라이브러리 및 Java 응용 프로그램을 실행하는 데 필요한 기타 파일의 조합입니다.
이해가 가시나요?
간단히 말하자면 자바 프로그램 실행을 위한 라이브러리, API, JVM이 포함되어 있다고 생각하시면 됩니다.

JDK

JDK 란?

마지막으로 JDK는 Java Development Kit의 약자입니다.
결론부터 말하자면 자바 개발을 위한 소프트웨어 패키지입니다.
JAVA를 사용하는 개발자라면 JAVA로 작성된 소스코드를 컴파일하고 관리하여야 하는데 이때 사용되는 것이 JDK입니다.

JDK의 역할

JDK는 JVM, JRE에 의해 실행 및 구동될 수 있는 자바 프로그램 생성을 돕습니다.

그럼 JDK의 구성 요소는 무엇일까요?
JDK는 자바 개발을 위한 키트로 JRE 및 기타 개발 도구로 구성됩니다.
개발 도구에는 자바 컴파일러인 javac , 아카이버(jar), 문서생성기(javadoc) 등이 존재하고 이러한 도구들은 Java 응용 프로그램 개발에 사용됩니다.
예로 컴파일러는 JVM 설명에서 말씀드린 것처럼 .java 파일을 받아서 실행 가능한 .class 파일로 만드는 기능이 있는 소프트웨어입니다. 컴파일러와 같이 자바 개발에 필요한 도구들이 포함되어 개발자는 JDK를 사용하여 편리하게 자바 기반 애플리케이션을 생성할 수 있는 것이죠.
위에서 말씀드린 것처럼 JDK를 설치 시 JRE가 포함되어 있으므로 JRE를 별도로 다운로드할 필요가 없습니다.
컴파일 결과물 실행하기 위해서는 JRE가 필요하고 프로그램 구동은 프로그램 개발의 일환이기 때문에 JDK는 JRE를 필요로 하는 것이죠.

구성요소

JDK = JRE + 개발을 위한 도구
JDK의 bin 디렉터리에 있는 주요 실행 파일들은 다음과 같습니다.
javac.exe : 자바 컴파일러입니다. 자바 소스를 파이트코드로 컴파일합니다.
java.exe : 자바 인터프리터입니다. 컴파일러가 생성한 바이트코드를 해석하고 실행합니다.
javap.exe : 역 어셈블러로 컴파일된 클래스파일을 원래의 소스로 변환합니다.
javadoc.exe : 자동 문서 생성기로 소스파일에 잇는 주석을 이용하여 API 문서와 같은 형식의 문서를 자동으로 생성합니다.
jar.exe : 압축프로그램입니다. 클래스파일과 프로그램의 실행에 관련된 파일을 하나의 jar 파일로 압축하거나 압축해제합니다.

728x90

'Java > About Java' 카테고리의 다른 글

[Java] 생성자  (2) 2023.01.31
[Java] Java Memory Leak  (0) 2023.01.11
[Java] Primitive Type & Reference Type  (0) 2023.01.09
[Java] JNA? JNI?  (0) 2023.01.04
[Java] Java Memory  (1) 2022.12.28