개발 일기

[Java] 자바에 대해 2 - JDK ? JRE ? JVM ? 본문

Back-End/Java

[Java] 자바에 대해 2 - JDK ? JRE ? JVM ?

개발 일기장 주인 2024. 3. 6. 12:37

군대가기전 대학교 2학년 처음 자바를 접할때 부터 자바하면은 JDK, JRE, JVM 이런 용어들이 무진장 나왔고 비슷 비슷한 단어에 혼란이 있었지만 그 당시에 문법 익히기에 급급했던 터라 기본적인 것을 놓치고 학습했던 것같다. 이번에 확실히 정리해두자.

JDK (Java Development Kit)

JDK는 자바 개발키트 Java Development Kit의 줄인 말로 개발자들이 자바로 개발하는 데 사용되는 SDK이다.
그래서 JDK안에는 자바를 개발 시 필요한 라이브러리들과 javac, javadoc 등의 개발 도구들을 포함되어 있고, 개발을 하려면 자바 프로그램을 실행도 시켜줘야 하기 때문에 뒤에서 배울 JRE(Java Runtime Environment)도 함께 포함되어 있다.

Development Tools들을 잠깐 들여다보면?

  • javac: 자바 컴파일러로 소스 코드를 바이트 코드로 변환
  • java: 자바 인터프리터로 바이트 코드를 기계어로 변환
  • javadoc:  Java 소스 코드에서 자동으로 HTML형식의 API 문서를 생성
  • jar: Java Archive로 Java 애플리케이션과 관련된 클래스, 리소스 등을 하나의 파일로 압축한 형식. 애플리케이션을 패키징하고 배포하는 데 사용
  • jdb: Java Debugger의 약자로, 자바 프로그램을 디버깅하는 데 사용되는 명령줄 도구. jdb를 사용하면 프로그램 실행 중에 중단점을 설정하고, 변수의 값을 확인하며, 스택 추적을 수행하고, 프로그램의 동작을 단계별로 따라가며 버그를 찾기 위해 존재

이 외에도 jlink, jmod, javap 등 더 있다.

SDK란?
SDK(Software Development Kit)는 하드웨어 플랫폼, 운영체제 또는 프로그래밍 언어 제작사가 제공하는 소프트웨어 개발 도구 모음으로, 개발자가 특정 플랫폼, 프레임워크, 언어 등에서 소프트웨어를 개발할 수 있도록 필요한 도구와 라이브러리, 문서 등을 제공한다. 컴파일러, 라이브러리, 디버깅 도구, 에뮬레이터 또는 시뮬레이터, 문서와 예제 코드 등을 포함하며 그 예시로 안드로이드 스튜디오, JDK 등을 들 수 있다. 

 

JRE (Java Runtime Environment)

JRE는 자바 실행환경 Java Runtime Environment의 줄임말로 JVM과 자바 프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지이다. 이외에도 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일(jar 파일)을 가지고 있다. JRE는 기본적으로 JDK에 포함되어 있기 때문에 JDK를 설치하면 함께 설치된다. 기존에는 개별적으로 설치가 가능했지만 JDK11 버전부터는 따로 제공되지 않는다.

정리해보면 Java로 프로그램을 직접 개발하기 위해서 필요한 것이 JDK이고, 컴파일 된 Java 프로그램을 실행시키기 위해서 JRE가 필요하다고 보면 된다.

JRE(Java Runtime Enviroment): JVM(Java Virtual Machine) + Libraries

 

JVM (Java Virtual Machine)

JVM은 자바 가상머신 Java Virtual Machine을 줄인 말로 직역하면 '자바를 실행하기 위한 가상 기계(컴퓨터)'이다.  그냥 자바를 돌리기 위해 소프트웨어화 된 하드웨어이다. 비유적으로 일종의 에뮬레이터인 것이다.

자바로 작성된 모든 프로그램은 JVM 위에서만 실행될 수 있으므로, 자바 프로그램을 실행하기 위해서는 반드시 자바 가상 머신이 설치되어 있어야 한다.

위의 그림처럼 일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되지만 자바 응용 프로그램의 코드는 운영체제나 하드웨어가 아닌 JVM과 통신하고 전달 받은 코드를 JVM이 운영체제가 이해할 수 있도록 변환하여 전달한다.

 

Java 코드의 흐름

JDK에 포함된 자바 컴파일러(javac)가 자바 소스 코드(.java)를 컴파일하여 바이트 코드(.class)로 변환한다. 바이트 코드는 JVM에서 실행 가능한 중간 형태의 코드이고 JVM은 이러한 바이트 코드를 로드하고 해석하여 기계어로 변환하며, 이렇게 변환된 기계어는 해당 운영 체제로 넘겨주고 실행되게 된다.

 

이때 중간 형태의 코드가 필요한 이유는 왼쪽 그림으로 설명될 수 있을 것 같다.

JVM이 각 플랫폼에 맞게 기계어로 처리를 해주는 과정을 좀 더 쉽게 수행하기 위해서이다. 즉, JVM은 중간 언어를 받아서 최종적으로 중간 언어만 기계어로 바꿔주는 전략이, 소스 파일을 처음 부터 각 플랫폼에 맞는 기계어로 바꾸는 것보다 유리하기 때문이다.

 

 

 

 

 

또한 JVM에서 바이트 코드를 기계어로 변환하는 과정에서 사용하는 컴파일러는 JIT(Just-In-Time) 컴파일러라고 한다. 추후에 컴파일러와 인터프리터의 차이점을 글로 정리해보면서 JIT 컴파일러를 함께 다뤄보면 좋을 것같다.

 

또한 JVM에 대해서도 더 깊이 뜯어볼 필요가 있을 것 같다.

 

 

 

정리해보면...
자바 언어는 "Write Once, Run Anywhere(WORA)"라는 원칙을 따른다고 했다.

이는 자바로 작성된 프로그램이 한 번 작성되면 어떤 운영 체제에서든 동일하게 실행될 수 있기 자바 프로그램은 운영체제에 독립적임을 의미한다고 했는데 이는 자바 컴파일러(javac)가 자바 소스 코드를 바이트 코드로 변환하고, 이 바이트 코드를 JVM이 해석하여 실행하기 때문에 가능하다.

하지만 JVM은 운영 체제에 종속적이다. JVM은 운영 체제와 하드웨어에 특화된 구현체이다. 따라서 동일한 자바 프로그램이라도 각 운영 체제에 맞는 JVM이 필요하며, 각 JVM은 해당 운영 체제와 하드웨어에서 실행되기 위한 특정한 기능과 동작을 제공한다.

즉, 자바 프로그램은 운영 체제에 독립적이지만, 프로그램을 실행하기 위한 JVM은 운영 체제에 종속적이다. 따라서 자바 프로그램을 실행하기 위해서는 해당 운영 체제에 맞는 JVM이 설치되어 있어야하고 이러한 JVM의 종속성은 자바의 큰 장점 중 하나인 "Write Once, Run Anywhere"의 원칙을 실현하기 위해 발생하는 것으로, 자바 개발자는 자바로 작성된 프로그램을 여러 운영 체제에서 동일하게 실행할 수 있도록 하기 위해 JVM의 종속성을 감수하게 되는 것이다.