개요: 포함 관계
세 요소의 관계를 가장 쉽게 이해하는 방법은 포함 관계로 보는 것입니다.
- JDK (Java Development Kit) 는 JRE를 포함합니다.
- JRE (Java Runtime Environment) 는 JVM을 포함합니다.
따라서 개발자는 JDK를 설치하며, 최종 사용자는 JRE만 설치하여 Java 애플리케이션을 실행합니다.

1. JVM (Java Virtual Machine)
JVM은 "자바 가상 머신"의 약자로, Java의 핵심 철학인 "한 번 작성하면, 어디서든 실행된다 (Write Once, Run Anywhere)"를 가능하게 하는 기술적 기반입니다.
- 핵심 역할: Java 바이트코드(Bytecode)를 실행하는 가상의 컴퓨터(소프트웨어)입니다. 실제 물리적 컴퓨터의 CPU나 운영체제에 종속되지 않고, 바이트코드를 해당 플랫폼에 맞는 기계어로 해석하고 실행하는 역할을 담당합니다.
- 주요 특징:
- 플랫폼 독립성: 각 운영체제(Windows, macOS, Linux 등)에 맞는 JVM이 설치되어 있기만 하면, 동일한 바이트코드(.class 파일)를 수정 없이 실행할 수 있습니다.
- 메모리 관리: 가비지 컬렉션(Garbage Collection)을 통해 개발자가 직접 메모리를 관리해야 하는 부담을 줄여줍니다.
- 스펙과 구현: JVM은 그 자체로 추상적인 사양(Specification)이며, Oracle의 HotSpot VM, OpenJ9, GraalVM 등 여러 벤더가 이 사양을 만족하는 구현체(Implementation)를 제공합니다.
- 주요 구성 요소:
- 클래스 로더 (Class Loader): 컴파일된 .class 파일을 런타임 데이터 영역으로 로드합니다.
- 런타임 데이터 영역 (Runtime Data Areas): JVM이 프로그램을 실행하기 위해 사용하는 메모리 영역입니다. (Method Area, Heap, Stack Area 등)
- 실행 엔진 (Execution Engine): 클래스 로더를 통해 로드된 바이트코드를 해석(Interpreter)하거나, JIT(Just-In-Time) 컴파일러를 통해 네이티브 코드로 변환하여 실행합니다.
2. JRE (Java Runtime Environment)
JRE는 "자바 런타임 환경"의 약자로, 컴파일된 Java 애플리케이션을 실행하는 데 필요한 모든 것을 포함하는 소프트웨어 패키지입니다.
- 핵심 역할: Java 애플리케이션이 실행될 수 있는 환경을 제공합니다.
- 주요 구성 요소:
- JVM: 위에서 설명한 자바 가상 머신을 포함합니다.
- Java 클래스 라이브러리 (Java Class Libraries): Java API를 포함하는 핵심 라이브러리 파일들입니다. java.lang, java.util, java.net 등 애플리케이션 구동에 필수적인 클래스들을 제공합니다. (예: rt.jar)
- 사용 대상: Java로 개발된 프로그램을 사용하려는 **최종 사용자(End-user)**입니다. 개발 도구는 포함되어 있지 않으므로, JRE만으로는 소스 코드를 컴파일할 수 없습니다.
3. JDK (Java Development Kit)
JDK는 "자바 개발 키트"의 약자로, Java 애플리케이션을 개발하는 데 필요한 모든 도구를 포함하는 포괄적인 소프트웨어 개발 키트입니다.
- 핵심 역할: Java 소스 코드를 작성하고, 컴파일하며, 디버깅하고, 실행하는 데 필요한 모든 환경과 도구를 제공합니다.
- 주요 구성 요소:
- JRE: JDK는 JRE를 완전히 포함하므로, 개발자는 JDK 설치 후 별도로 JRE를 설치할 필요가 없습니다.
- 개발 도구 (Development Tools):
- javac: 자바 소스 코드(.java)를 바이트코드(.class)로 변환하는 컴파일러
- java: 컴파일된 바이트코드를 실행하는 런처 (실제로는 JRE에 포함)
- javadoc: 소스 코드 주석을 기반으로 API 문서를 생성하는 도구
- jdb: Java 애플리케이션의 버그를 찾는 데 사용되는 디버거
- jar: 관련 클래스 라이브러리들을 하나의 파일로 묶는 아카이버
- 사용 대상: Java 애플리케이션을 개발하려는 소프트웨어 개발자입니다.
4. 주요 차이점 요약
| 구분 (Component) | 핵심 역할 (Core Role) | 주요 구성 요소 (Key Components) | 사용 대상 (Target User) |
| JVM | 바이트코드 실행 | 클래스 로더, 런타임 데이터 영역, 실행 엔진 | - (JRE의 일부) |
| JRE | Java 애플리케이션 실행 | JVM + 클래스 라이브러리 | 최종 사용자 |
| JDK | Java 애플리케이션 개발 | JRE + 개발 도구 (javac, jdb 등) | 개발자 |
'JAVA' 카테고리의 다른 글
| Serializable (0) | 2025.12.04 |
|---|---|
| about JVM (0) | 2025.09.30 |
| Primitive Type과 Reference Type (0) | 2025.09.30 |
| 자바의 hashCode(), hash()에 대하여 (0) | 2025.03.10 |