
오늘은 자바 프로그램의 실행 과정을 단계별로 살펴보며, 그 과정에서 JDK, JRE, JVM의 역할과 관계를 이해해보는 시간을 가져볼게요!
이를 통해 자바의 핵심 특징인 플랫폼 독립성이 구현되는 원리를 함께 알아보겠습니다.
이 개념들을 이해하면 다음을 명확히 알 수 있을거에요!
- 자바가 운영체제에 상관없이 동작할 수 있는 이유(플랫폼 독립성)
- 자바 코드가 컴파일되고 실행되는 전체 과정
- JDK, JRE, JVM 각각의 기능과 역할
자바의 플랫폼 독립성

컴퓨터는 기본적으로 0과 1, 즉 기계어만 이해합니다. 하지만 이 기계어는 운영체제(OS)마다 다르기 때문에, 같은 프로그램이라도 Windows, macOS, Linux에서 실행 방식이 달라집니다.
자바는 이러한 문제를 해결하여 한 번 작성하면 어디서나 실행된다(Write Once, Run Anywhere)는 철학을 실현했습니다. 이 철학을 가능하게 하는 핵심 개념이 바로 플랫폼 독립성입니다.
플랫폼 독립성이란?
운영체제에 관계없이 동일한 코드가 같은 방식으로 동작하는 성질을 말합니다.
자바는 이 플랫폼 독립성을 구현하기 위해 중간 언어인 바이트코드(Bytecode)를 사용합니다.
자바 코드는 먼저 운영체제에 의존하지 않는 바이트코드 형태로 컴파일됩니다.
그다음, 이 바이트코드를 실제 각 운영체제 환경에서 해석하고 실행하는 역할을 맡는 것이 바로 JVM(Java Virtual Machine)입니다.
자바 코드의 실행 과정

자바 프로그램이 실행되는 과정은 크게 두 단계로 나눌 수 있습니다.
(1) 컴파일 단계
개발자가 작성한 .java 파일은 컴파일러(javac)를 통해 .class 확장자의 바이트코드(Bytecode)로 변환됩니다.
이 단계는 운영체제에 영향을 받지 않으며, 항상 동일한 형태의 바이트코드를 생성합니다.
(2) 실행 단계
컴파일을 통해 만들어진 .class 파일은 JVM(Java Virtual Machine)이 불러와 실행합니다.
JVM은 바이트코드를 각 운영체제가 이해할 수 있는 기계어 명령어로 변환하여 실제 실행을 담당합니다.
즉, 개발자는 자바 코드 → 바이트코드까지만 신경 쓰면 되고, 운영체제별 변환은 JVM이 알아서 처리한다는 점이 자바의 큰 강점입니다.
JVM, JRE, JDK의 관계

이제 자바 실행 구조에서 자주 등장하는 세 가지 핵심 개념인 JVM, JRE, JDK의 관계를 구체적으로 살펴보겠습니다.
| 구성 요소 | 포함 내용 | 주요 역할 |
| JVM (Java Virtual Machine) | - | 바이트코드를 해석하고 각 운영체제의 명령어로 변환하여 실행하는 가상 머신 |
| JRE (Java Runtime Environment) | JVM + 자바 표준 라이브러리 | 자바 프로그램이 실행될 수 있는 실행 환경 제공 |
| JDK (Java Development Kit) | JRE + 컴파일러 + 디버거 등 개발도구 | 자바 프로그램을 개발하고 빌드할 수 있는 전체 도구 세트 |
즉, 관계를 한 줄로 요약하면 다음과 같습니다.
JDK > JRE > JVM
- JVM → 실행기
- JRE → 실행 환경
- JDK → 개발 환경
예시로 이해하기
다음 코드를 실행한다고 가정해볼게요. 어떤 순서로 동작할까요?
System.out.println("Hello, World!");
- JDK의 컴파일러가 이 코드를 컴파일하여 바이트코드(.class)로 변환합니다.
- JRE에 포함된 표준 라이브러리(System 클래스 등)를 참조합니다.
- 마지막으로 JVM이 바이트코드를 읽어 각 운영체제에 맞는 기계어 명령어로 변환하고 실행합니다.
자바의 강력한 플랫폼 독립성은 바이트코드와 JVM 덕분에 가능하며,
이 실행 구조를 이해하면 자바 애플리케이션의 빌드, 배포, 실행 과정 전체를 명확히 파악할 수 있습니다.
이제 저희는 JDK, JRE, JVM이 각각 어떤 역할을 하는지 이해함으로써 더 효율적이고 안정적인 프로그램을 작성할 수 있을거에요!
'Language > Java ☕️' 카테고리의 다른 글
| Java static 키워드 완전 가이드 (0) | 2024.05.22 |
|---|---|
| 자바 메모리 구조 이해하기 (0) | 2024.05.22 |
| 자바의 가비지 컬렉션(GC) 한 번에 이해하기 (0) | 2024.02.02 |
| String vs StringBuffer vs StringBuilder — 자바 문자열 클래스의 차이 완전 정리 (0) | 2024.02.02 |
| Double과 Float를 사용하면 안되는 이유 (0) | 2024.02.01 |
안녕하세요, 저는 주니어 개발자 박석희 입니다. 언제든 하단 연락처로 연락주세요 😆