[Java #1] JDK(Java Development Kit) + JRE, JVM

yeonjiyooo·2025년 9월 9일
0

Java

목록 보기
1/1

Java와의 첫 만남 👋


☕️ Java

Java는 썬 마이크로시스템즈에서 1995년에 개발된 언어로, 플랫폼 독립성을 가지고 있고 강력한 라이브러리 생태계를 갖춘 객체지향 프로그래밍 언어이다.

✅ Java의 대표적인 특징 두가지

  1. 플랫폼 독립성 Write Once, Run Anywhere ↔ Write Once, Compile Anywhere
  2. 객체지향 → 코드 재사용, 유지보수 용이

C언어로 작성된 소스 코드 → 컴파일러 → 기계어
java 소스 코드 → 자바 컴파일러 → 바이트코드 .class 파일 → JVM 인터프리팅 → 기계어

Java는 자바 컴파일러를 통한 소스코드 → 바이트코드로의 변환과 JVM을 통한 바이트코드 → 기계어의 변환을 거친다. 즉, 컴파일러 언어와 인터프리터 언어의 특성을 모두 가지고 있어 하이브리드 언어라고도 불린다.


🧳 JDK Java Development Kit

JDK란 Java 어플리케이션을 개발하기 위한 컴파일러, 라이브러리, 실행환경(JRE)을 포함한 개발 도구 모음을 의미한다.

어플리케이션 개발을 위해서는 코드, 그것을 실행할 환경, 컴파일러, 디버깅 등등 다양한 과정이 진행되며 이것들을 위한 도구들이 필요하다. 이러한 도구들을 통합하여 빠르고 안정적인 개발을 가능하게 만들어 준 것이 바로 JDK이다.

JDK = JRE + Development Tools


⏰ JRE Java Runtime Environment

JRE는 Jave 어플리케이션을 실행하기 위한 환경이다. JRE는 실행만을 위한 최소한의 구성을 제공하므로 시스템 자원 절약이 가능해진다는 장점이 있다. 개발자에게 있어 한정된 자원을 효율적으로 사용하는 것은 중요한 문제이다. 과거는 더더욱이 자원이 부족했기에 JRE와 Development Tool을 분리하여 JDK를 구성한 것으로 보인다.

🦾 JRE의 구성 요소

  • JVM 가상 머신
  • Java Class Library: 자주 사용되는 기능들의 표준 API 집합 (ex. 입출력, 문자열)

JRE = JVM + Java Class Library

개발이 완료된 프로그램을 단순히 실행만 하면 되는 경우에는 JRE만 설치하면 된다. 하지만 추가적인 개발이나 컴파일 작업 등이 필요한 경우는 JDK를 설치해야 한다.


🌐 JVM Java Virtual Machine

JVM은 자바 바이트 코드를 실행하기 위한 가상 머신이다. Java의 OS 독립성을 보장해주기 위한 가장 핵심적인 부분이며 메모리 누수와 같은 부수적인 프로그램에 대한 관리도 가능하게 해준다.

JVM은 자바 이외에도 코틀린,스칼라 등과 같은 다른 언어에서도 사용 가능한데 이는 다른 언어들도 자바 바이트 코드로 컴파일되도록 만들어졌기 때문이다.

🌀 JVM에서 바이트 코드를 처리하는 과정

  1. javac(자바 컴파일러)가 생성한 .class 파일을 JVM의 클래스로더가 메모리에 올림
  2. 인터프리팅 + JIT 컴파일러 방식을 사용해 특정 환경의 기계어로 변환
    • 인터프리팅: 바이트코드를 한 줄씩 기계어로 변환하여 실행
    • JIT 컴파일러: 런타임에 기계어로 컴파일해두고 캐싱

그럼 JVM에서는 왜 인터프리팅을 사용할까? 이는 Write One, Run Anywhere 를 구현하고자 하는 자바의 철학과 동일선상에서 생각해볼 수 있다. 컴파일러는 결국 플랫폼에 종속되기 때문에 이를 피하고자 인터프리터를 사용한 것이다. 또한 인터프리터는 초기 실행 속도가 빠르다는 장점이 있어 JIT과 함께 사용하며 속도적인 측멱에서의 단점도 최소화 하였다.

Java가 OS 독립적일 수 있는 이유는 Java로 작성된 소스파일은 JVM을 거쳐 OS와 상호작용하기 때문이다. 호스트 OS의 종류와 관계 없이 JVM만 설치되어 있다면 동일한 바이트코드를 수정없이 사용할 수 있다.

반면 컴파일러 언어의 경우, OS 별로 별도의 컴파일이 필요하다. (Write Once, Compile Anywhere) 또한 OS API를 직접 호출하는 코드가 있다면 OS 별로 코드 작성을 다르게 해야한다는 단점이 있다. 이는 단순히 OS별 재컴파일만 해서 해결되는 문제가 아닌, 코드를 작성하는 과정에서도 번거로움이 생기는 것이다.

thread 생성으로 보는 예시 상황

C 소스 코드

// Windows API
#include <windows.h>
CreateThread(...);

// Linux API
#include <pthread.h>
pthread_create(...);

Java 소스 코드

//어떤 OS든 동일
new Thread(() -> {
    System.out.println("Hello");
}).start();

💊 JIT 컴파일러

JVM에서 바이트코드가 기계어로 변환될 때에는 인터프리팅 방식으로 진행된다. 결론적으로 java로 작성된 소스코드는 두 번의 변환 과정을 거쳐 기계어로 번역되는 것이고 이로 인한 속도저하가 발생한다. 이러한 속도 측면의 한계를 극복하고자 등장한 것이 JIT 컴파일러이다.

자주 실행되는 코드를 런타임에 기계어로 변환하고 이후에는 캐싱을 통해 바로 실행하여 속도를 향상시키는 것이다. 런타임에 진행되는 특성을 반영하여 Just-In-Time JIT 이라는 이름이 붙여졌다.



본격적으로 Java를 공부하기 전 Java 언어의 특성과 JDK, JRE, JVM에 대한 개념을 정리하는 시간을 가져보았다. JVM에 대한 개념과 왜 JIT 컴파일러와 인터프리터를 함께 사용하는지 이해하는 과정이 다소 어려웠다. 가상머신에 대해서는 학부 운영체제 수업때 들어 알고는 있었지만 이를 JVM 적용시키려니 조금 헷갈리는 부분이 있었던 것 같다 😢 JVM에 대해서는 다음 글에서 더 자세히 공부해봐야겠다!

profile
1 ^ 365 = 1 이지만 1.01 ^ 365 = 37쩜 어쩌고... 이다!

0개의 댓글