Java Components: Java Platform, JDK, JRE, & Java Virtual Machine
Java Platform
Java 플랫폼은 Java 프로그래밍 언어로 작성된 애플리케이션을 실행하는 데 도움을 주는 소프트웨어나 프로그램의 모음입니다. Java 플랫폼은 Java 컴파일러, 라이브러리 세트 및 실행 엔진으로 구성됩니다.
Java 플랫폼은 특정 운영 체제에 독립적이므로 Java 프로그래밍 언어는 플랫폼에 독립적인 언어로 알려져 있습니다.
Java 플랫폼은 다음과 같은 구성 요소로 구성됩니다.
- Java language
- The Java Development Kit (JDK)
- The Java Runtime Environment (JRE)
- The Java Compiler
- The Java Virtual Machine (JVM)
위에서 언급한 주요 구성 요소 외에도 Java 플랫폼에는 garbage collectors, 다양한 라이브러리 및 Java 애플리케이션을 효율적으로 실행하기 위해 필요한 기타 추가 구성 요소와 도구가 포함되어 있습니다.
다음과 같은 다이어그램을 고려해 보겠습니다. 이 다이어그램은 이러한 구성 요소들 간의 관계를 보여줍니다.

위의 다이어그램을 통해 우리는 다음과 같은 결론을 내릴 수 있습니다.
JRE = JVM + library classes.
JDK = JRE + Developer tools.
각 구성 요소를 다루기 전에, 먼저 Java 프로그램 실행의 실행 흐름을 이해해 봅시다.
다음 다이어그램은 Java 프로그램의 실행 흐름을 보여줍니다.

위의 다이어그램은 Java 프로그램의 간단한 실행 흐름을 보여줍니다. Java 언어로 작성된 프로그램은 Java 컴파일러(javac)에 의해 컴파일됩니다. 다른 언어의 컴파일러가 컴파일 후에 특정 CPU의 기계 코드를 생성하는 것과는 달리, Javac 컴파일러는 바이트 코드로 구성된 클래스 파일을 생성합니다.
이제 이 클래스 파일은 Java 가상 머신(JVM)에 제공되어 클래스 파일을 특정 CPU에 종속된 기계 코드로 번역합니다. 그런 다음 이 코드가 특정 CPU에서 실행됩니다.
이제 각 구성 요소에 대해 자세히 설명해 보겠습니다.
Java Language
Java는 Java 플랫폼에서 사용하는 프로그래밍 언어입니다. Java는 객체지향 프로그래밍 언어로, 그 문법은 C에서 파생되었으며, 객체지향 프로그래밍 기능은 C++에서 파생되었습니다. Java는 자체의 문법, 규칙, 형식 및 프로그래밍 패러다임을 갖고 있습니다.
The Java Compiler
Java 프로그래밍 언어의 컴파일러이며, 그 기능은 Java 소스 코드로부터 Java 클래스 파일을 생성하는 것입니다. Java 클래스 파일은 플랫폼에 독립적인 Java 바이트 코드를 포함합니다.
클래스 파일을 생성한 후, JVM은 이러한 클래스 파일을 로드하고, 바이트 코드를 해석하거나 Just-in-time (JIT) 컴파일러를 사용하여 기계 코드로 변환합니다.
The Java Virtual Machine (JVM)
JVM은 Java 프로그래밍 언어와 Java 플랫폼의 핵심입니다. JVM은 바이트 코드를 특정 CPU의 기계 코드로 변환합니다(다른 프로그래밍 언어에서는 오브젝트 코드라고도 합니다).
JVM은 가비지 컬렉션, 메모리 관리, 보안 등의 기능을 제공합니다. JVM은 플랫폼에 독립적이며, 가상 인터페이스를 사용하여 기능을 사용자(개발자) 정의할 수 있습니다. 이 가상 인터페이스는 특정 CPU에 종속적이지 않으며 운영 체제에도 독립적입니다.
JVM의 이러한 플랫폼 독립성은 한 기계에서 Java 프로그램을 작성하고 다른 기계에서 실행할 수 있게 해줍니다 (WORA - Write Once, Run Anywhere).
다음 다이어그램은 JVM의 다양한 구성 요소를 보여줍니다.

JVM은 메인 메모리, RAM에 존재합니다. Java 프로그램이 Java 컴파일러에 의해 클래스 파일로 변환되면 실행해야 합니다.
실행을 위해 클래스 파일은 클래스 로더에 의해 메인메모리 RAM에 가져와집니다. 여기서 바이트 코드는 보안 문제를 위해 확인됩니다. 클래스 로더는 또한 실행할 프로그램의 로딩, 링크, 초기화를 담당합니다.
위 다이어그램에 나와있는 JVM 메모리에는 다양한 구성 요소가 있으며, 이들은 현재 실행해야 할 명령을 포함하는 PC(program counter) 레지스터를 보유하여 프로그램의 실행을 도와줍니다. 변수, 배열 등을 보유하는 Heap도 있습니다.
JVM 메모리에는 메서드 영역과 Native 메서드 스택도 포함되어 있습니다. 메서드 영역은 메서드 코드를, Native 메서드 스택은 네이티브 언어 사양을 각각 포함합니다. JVM 스택은 프로그램의 인스턴스나 현재 스레드를 보유합니다. 여러 개의 스레드가 있는 경우 각 스레드는 자체 JVM 스택을 가지게 됩니다.
프로그램이 올바르게 링크된 후, 실행 엔진으로 전달됩니다. 실행 엔진은 네이티브 메서드 인터페이스와 네이티브 메서드 라이브러리와 함께 작동합니다. 네이티브 메서드 인터페이스는 Java 코드가 네이티브 메서드 라이브러리의 일부인 라이브러리와 네이티브 애플리케이션을 호출할 수 있게 해주는 프로그래밍 프레임워크입니다.
다음으로, 실행 엔진은 바이트 코드를 네이티브 기계 코드로 변환하기 위해 JIT(Just-in-time) 컴파일러를 사용합니다. 그런 다음 기계가 프로그램을 실행합니다.
참고: JIT(Just-in-time) 컴파일러는 Java 가상 머신(JVM)의 일부입니다. JIT 컴파일러는 동일한 기능을 가진 바이트 코드의 일부를 동시에 해석합니다. 다시 말해, JIT 컴파일러는 프로그래밍 수준에서 바이트 코드를 네이티브 기계 코드로 변환합니다. 이것이 Java가 컴파일된 및 해석된 언어인 이유입니다.
The Java Runtime Environment (JRE)
JRE(Java Runtime Environment)는 이름에서 알 수 있듯이 Java 프로그램과 응용 프로그램을 실행하는 데 필요한 런타임 환경입니다. JRE는 Java Virtual Machine (JVM) 및 Java 프로그램을 성공적으로 실행하기 위한 이진 파일과 다른 클래스로 구성됩니다.
JRE는 JDK의 하위 집합이며 Java 컴파일러, 디버거 등과 같은 개발 도구를 포함하지 않습니다. 따라서 Java 애플리케이션이 다른 곳에서 개발되었고, 해당 애플리케이션을 실행하기만 하려는 경우 별도로 JRE를 설치할 수 있습니다. 이 경우 JDK를 설치할 필요는 없습니다.
자신의 컴퓨터에서 Java 프로그램을 실행하기 위해 JRE가 설치되어 있어야 합니다. 이는 Java 프로그램을 실행하기 위한 최소 요구 사항입니다.
JRE에는 다음과 같은 구성 요소가 포함되어 있습니다.
- Code libraries, property settings, and resource files: 여기에 charsets.jar, rt.jar 등과 같은 파일들이 포함됩니다.
- DLL files: Java HotSpot Client Virtual Machine 및 Server Virtual Machine에서 사용됩니다.
- Java extension files: 예를 들어, localedata.jar와 같은 로캘(specification) 관련 파일들이 있습니다.
- Files required for security management. 예를 들어, java.policy, java.security 있습니다.
- Applet support classes.
- True Type font files: 일반적으로 자바 플랫폼에 의해 요구됩니다.
Java로 작성된 애플리케이션 또는 프로그램을 실행하려면 시스템에 JRE가 설치되어 있어야 합니다. JRE는 플랫폼에 종속적입니다. 즉, 사용 중인 운영 체제와 아키텍처와 호환되는 JRE를 다운로드하고 설치해야 합니다.
The Java Development Kit (JDK)
JDK(Java Development Kit)는 Java 환경의 핵심 구성 요소입니다. JDK에는 JRE(Java Runtime Environment)와 함께 Java 컴파일러, Java 디버거 및 기타 핵심 클래스가 포함되어 있습니다. JDK는 Java 개발에 사용되며, Java 프로그램을 컴파일하고 디버그하는 데 필요한 모든 실행 파일, 이진 파일 및 도구를 제공합니다.
JDK는 플랫폼별 소프트웨어이므로 각 운영 체제마다 별도의 JDK 설치 파일이 있습니다.
JDK에는 다음과 같은 구성 요소가 포함되어 있습니다.
- jConsole: 이것은 Java 모니터링 및 관리 콘솔입니다.
- jar: 이것은 Archiver입니다. 이 도구는 관련된 클래스 라이브러리를 하나의 JAR 파일로 패키징하고 JAR 파일을 관리하는 데 사용됩니다.
- jarSigner: 이 도구는 JAR 파일의 서명(signing) 및 확인(verification)에 사용됩니다.
- javap: 이 도구는 Java Class 파일을 분석하여 해당 클래스의 내용과 구조를 표시하는 도구입니다. 이 도구는 클래스 파일의 바이트 코드를 읽고 해석하여 클래스의 멤버 (필드, 메서드) 및 클래스의 계층 구조, 상수 풀 등을 보여줍니다. javap를 사용하여 클래스 파일의 내부 정보를 검토하고 디버깅, 성능 분석, 코드 분석 등의 목적으로 사용할 수 있습니다.
- javaws: JNLP(Java Network Launch Protocol) 애플리케이션을 위한 Java 웹 스타트 런처입니다. Java 웹 스타트 런처는 JNLP 파일을 사용하여 웹에서 다운로드한 Java 애플리케이션을 실행하는 역할을 합니다. 이 런처는 Java 웹 스타트 기능을 통해 사용자가 웹 브라우저를 통해 Java 애플리케이션을 쉽게 시작할 수 있도록 도와줍니다. JNLP 애플리케이션을 시작하고 필요한 자원을 다운로드하며, 로컬에서 실행될 수 있도록 환경을 구성하는 등의 작업을 수행합니다.
- jhat: Java 힙(Heap) 분석 도구입니다. 이 도구는 Java 애플리케이션의 힙 메모리 사용을 분석하고 모니터링하는 데 사용됩니다. Java 애플리케이션의 힙은 객체 인스턴스, 배열 등의 동적으로 할당되는 메모리를 관리하는 영역입니다. Java 힙 분석 도구는 메모리 누수, 객체 수명, 메모리 사용량 등과 관련된 문제를 식별하고 해결하기 위해 사용됩니다. 이를 통해 애플리케이션의 성능 향상과 메모리 관리 최적화를 위한 인사이트를 제공할 수 있습니다.
- jrunscript: Java 커맨드 라인 스크립트 셸입니다. 이것은 Java 프로그램을 실행하고 관리하기 위해 커맨드 라인에서 사용되는 스크립트 셸입니다. Java 커맨드 라인 스크립트 셸은 Java 명령어를 사용하여 Java 애플리케이션을 실행하고 인수를 전달하며, 환경 변수를 설정하고 다양한 Java 관련 작업을 수행하는 데 사용됩니다. 이를 통해 사용자는 터미널 또는 스크립트 환경에서 Java 애플리케이션을 편리하게 실행하고 제어할 수 있습니다.
- jstack: 이 도구는 Java 스레드에 대한 스택 추적(stack trace)을 출력하는 유틸리티입니다. 이 도구는 Java 애플리케이션의 실행 중인 스레드의 상태와 호출(Call) 스택 정보를 확인할 수 있습니다. jstack를 사용하여 스레드 데드락(deadlock), 동기화 문제, 스레드 풀 상태 등과 관련된 문제를 진단하고 해결하는 데 도움이 됩니다. 이를 통해 애플리케이션의 성능 개선과 디버깅에 유용한 정보를 얻을 수 있습니다.
- Javadoc: 이 도구는 소스 코드의 주석으로부터 자동으로 문서를 생성합니다. 이를 통해 개발자는 소스 코드에 작성된 주석을 기반으로 자동으로 문서화된 API 문서를 생성할 수 있습니다. 이 도구는 Javadoc이라고도 불립니다. Javadoc을 사용하여 개발된 Java 클래스, 인터페이스, 메서드 등에 대한 설명과 사용법, 매개변수, 반환값 등의 정보를 문서화할 수 있습니다. 이를 통해 다른 개발자들이 쉽게 이해하고 사용할 수 있는 API 문서를 생성할 수 있습니다.
- appletviewer: 웹 브라우저 없이 애플릿을 실행하고 디버깅하는 데 사용됩니다.
- apt: 이 도구는 주석 처리 도구(Annotation Processing Tool)입니다. 이 도구는 Java 소스 코드의 주석을 처리하고 해당 주석에 기반한 코드 생성 및 기타 작업을 수행합니다. 주석 처리 도구는 주로 컴파일 시점에서 주석을 분석하여 자동으로 코드를 생성하거나 소스 코드에 추가 정보를 주입하는 데 사용됩니다. 예를 들어, 주석 처리 도구를 사용하여 데이터베이스 테이블과 매핑되는 Java 객체를 생성하거나, 프로퍼티 파일에 정의된 메시지 리소스를 자동으로 생성하는 등의 작업을 수행할 수 있습니다. 주석 처리 도구는 코드 생성, 리소스 관리, 코드 분석 등의 작업을 자동화하여 개발 생산성을 향상시키는 데 도움을 줍니다.
- extCheck: 이 도구는 JAR 파일 간의 충돌을 확인하기 위해 사용되는 유틸리티입니다. 이 도구는 Java 확장(Extension) 디렉토리에 위치한 JAR 파일들 간의 충돌을 탐지하고 보고합니다. Java의 확장 디렉토리는 시스템 레벨의 확장 라이브러리들을 포함하며, 각 JAR 파일은 고유한 이름을 가져야 합니다. extCheck를 사용하여 서로 다른 JAR 파일이 동일한 이름을 가지고 있는지, 또는 서로 충돌하는 클래스 또는 리소스를 포함하고 있는지 확인할 수 있습니다. 이를 통해 JAR 파일 충돌로 인한 문제를 사전에 감지하고 해결할 수 있습니다.
- keytool: 이 도구는 Keystore를 조작하는 데 사용되는 유틸리티입니다. 이 도구를 사용하여 Keystore를 생성, 관리, 조작할 수 있습니다. Keystore는 보안 인증서, 개인 키, 공개 키 등의 보안 관련 자료를 저장하는 데 사용되는 저장소입니다. keytool을 사용하여 새로운 Keystore를 생성하거나 기존의 Keystore에 인증서를 추가하거나 삭제할 수 있습니다. 또한 keytool을 사용하여 인증서 요청(Certificate Signing Request)을 생성하거나, 인증서를 검사하고 관리할 수도 있습니다. 이를 통해 Java 기반의 애플리케이션에서 보안 인증서와 관련된 작업을 수행할 수 있습니다.
- policytool: 이 도구는 정책(Policy) 생성 및 관리 도구입니다. 이 도구를 사용하여 Java 보안 정책 파일을 생성하고 관리할 수 있습니다. Java 보안 정책은 애플리케이션에서 수행할 수 있는 보안 작업 및 권한을 정의하는데 사용됩니다. policytool을 사용하여 정책 파일을 생성하고 수정하며, 애플리케이션의 보안 정책을 구성할 수 있습니다. 이를 통해 애플리케이션에서 필요한 보안 수준과 권한을 정확하게 설정할 수 있습니다. policytool은 Java 애플리케이션의 보안 관리를 용이하게 해주는 중요한 도구입니다.
- xjc: 이 도구는 XML 바인딩(JAXB) API의 일부로, XML 스키마를 받아들여 Java 클래스를 생성하는 도구입니다. 이 도구는 XML 스키마를 기반으로 Java 클래스를 자동으로 생성하여 XML 데이터와 Java 객체 간의 매핑을 용이하게 해줍니다. xjc를 사용하면 XML 데이터를 쉽게 읽고 쓸 수 있는 Java 객체로 변환할 수 있으며, XML 데이터의 유효성 검사 및 데이터 바인딩과 같은 작업을 자동화할 수 있습니다. 이를 통해 Java 애플리케이션에서 XML 데이터를 처리하고 다루는 데 편리성과 생산성을 제공합니다.
따라서 JDK의 구성 요소들은 개발 관점에서 우리가 필요로 하는 요소들입니다.

위 다이어그램에서 보여진대로, Java 소스 코드는 JDK의 일부인 Java 컴파일러에 의해 바이트 코드로 변환됩니다. 그런 다음 이 바이트 코드는 JVM으로 전달되고 (이 과정은 이미 위에서 설명되었습니다) 여기서 JRE로 이동하여 코드가 실행됩니다.
JDK와 JRE에 대한 자세한 내용을 살펴보았으므로 이제 JRE와 JDK 간의 차이점에 대해 논의해 보겠습니다.
JRE Vs JDK
| No | JRE | JDK |
| 1 | JRE는 Java Runtime Environment의 약어입니다. | JDK는 Java Development Kit의 약어입니다. |
| 2 | JRE는 주로 Java 프로그램을 실행하는 데 사용됩니다. | JDK는 개발자들이 Java 프로그램을 개발하는 데 사용됩니다. |
| 3 | 내부에 Java 가상 머신(JVM)이 번들로 포함되어 있습니다. | JVM을 포함하지 않습니다. |
| 4 | JRE에는 Java 컴파일러가 없으므로 프로그램을 컴파일할 수 없습니다. | JDK에는 javac 컴파일러가 있으며 프로그램을 컴파일하는 역할을 담당합니다. |
| 5 | Java 클래스 라이브러리, java 명령어 및 기타 인프라가 포함되어 있습니다. | JDK에는 Java 애플리케이션 개발에 사용되는 Javadoc 및 아카이버와 같은 도구가 포함되어 있습니다. |
| 6 | JRE는 독립 실행형 프로그램으로 설치할 수 있습니다. | JDK는 별도의 설치 파일이며 JRE와 함께 번들로 제공됩니다. |
| 7 | 컴파일된/해석된 Java 프로그램을 입력으로 받고 출력을 생성합니다. | 컴파일된 Java 소스 프로그램은 클래스 파일로 변환되고 이후에 JVM에 전달됩니다. |
우리는 Java 개발 키트(JDK)에 대한 세부 정보를 알아봤는데, 이는 Java 런타임 환경(JRE) 및 Java 컴파일러와 함께 제공됩니다. JRE는 다시 말해 Java 가상 머신(JVM)을 포함하고 있으며, JVM은 Java 컴파일러에 의해 생성된 바이트 코드를 특정 기계 코드로 변환하는 역할을 담당합니다.
Java 언어를 포함한 모든 것은 Java 플랫폼이라는 상위 개체의 구성 요소들입니다. Java 플랫폼은 Java 애플리케이션을 실행하는 데 도움을 제공하는 환경입니다.
'Java' 카테고리의 다른 글
| Concurrency 1 (0) | 2024.04.08 |
|---|---|
| JVM 메모리 구조 (0) | 2024.04.08 |
| Class Loader (0) | 2024.04.08 |
| Dynamic Proxy Classes (0) | 2024.04.08 |
| Reflection (0) | 2024.04.08 |