JRE와 JDK 비교
JRE(Java Runtime Environment)는 자바 프로그램을 실행하는 환경이고, JDK(Java Development Kit)는 실행 기능에 컴파일러와 개발 도구를 더한 개발 키트입니다. 자바를 배우거나 소스 코드를 컴파일하려면 JDK를 선택합니다. 이미 만들어진 프로그램만 실행할 때는 해당 프로그램이 요구하는 런타임을 확인하며, 런타임이 함께 제공되는 앱은 별도 설치가 필요하지 않을 수도 있습니다.
JRE는 무엇인가요?
JRE는 컴파일된 자바 프로그램이 동작하는 데 필요한 실행 환경을 말합니다. 자바 바이트코드를 실행하는 JVM(Java Virtual Machine, 자바 가상 머신), 표준 클래스 라이브러리와 실행에 필요한 파일로 구성됩니다. 바이트코드는 자바 소스 코드에서 만들어지는 JVM용 명령이며, 보통 .class 파일에 저장됩니다.
일반적인 실행 전용 JRE 패키지에는 소스 코드를 컴파일하는 javac 도구가 없습니다. 따라서 java 명령으로 프로그램을 실행할 수 있다고 해서 자바 개발 도구까지 설치되어 있다고 판단할 수는 없습니다. JRE라는 개념과 실제 다운로드 페이지에서 제공하는 패키지 이름도 구분해야 합니다.
JDK는 무엇인가요?
JDK는 자바 프로그램을 개발하고 실행하는 데 필요한 도구 모음입니다. java로 프로그램을 실행하고, javac로 소스 코드를 클래스 파일로 컴파일합니다. 개발용 JDK를 설치했다면 그 JDK로 프로그램을 실행하기 위해 JRE를 추가로 설치할 필요는 없습니다.
javac:.java소스 파일을.class파일로 컴파일합니다.java: JVM을 시작하고 자바 프로그램을 실행합니다.jar: 클래스 파일과 리소스를 JAR(Java Archive) 파일로 묶습니다.javadoc: 소스 코드의 선언과 문서 주석을 바탕으로 API(Application Programming Interface, 프로그램 간 기능 사용 규약) 문서를 만듭니다.jdb: 프로그램 실행을 멈추고 변수 등을 확인하는 디버깅 도구입니다.
여기서 개발 도구를 제공한다는 말은 코드 편집기나 통합 개발 환경(IDE, Integrated Development Environment)까지 모두 포함한다는 뜻은 아닙니다. 편집기는 별도로 선택할 수 있으며, IDE를 사용하더라도 프로젝트의 빌드에 사용할 JDK를 지정해야 할 수 있습니다. 컴파일러의 역할은 Oracle의 javac 명령 문서에서 확인할 수 있습니다.
JVM과 JRE, JDK는 어떻게 다른가요?
JVM은 바이트코드를 실행하는 핵심 구성 요소입니다. JRE는 JVM에 라이브러리 등을 더한 실행 환경이고, JDK는 실행 환경과 개발 도구를 함께 제공합니다. 세 용어는 서로 대체할 수 있는 제품 이름이 아니라 서로 다른 역할과 범위를 나타냅니다.
예를 들어 HelloWorld.java를 javac로 컴파일하면 HelloWorld.class가 만들어지고, java HelloWorld를 실행하면 JVM이 그 클래스의 프로그램을 실행합니다. 클래스 파일을 다른 운영체제로 옮겨도 호환되는 런타임이 있으면 실행할 수 있지만, 운영체제 전용 라이브러리나 특정 Java 버전에 의존하는 프로그램에는 추가 조건이 있습니다. JVM과 클래스 파일의 관계는 자바 가상 머신 명세의 소개에 설명되어 있습니다.
JRE와 JDK 비교
| 비교 기준 | 실행 전용 JRE | JDK |
|---|---|---|
| 주요 목적 | 이미 컴파일된 프로그램 실행 | 프로그램 개발, 컴파일과 실행 |
| JVM과 실행 라이브러리 | 포함 | 포함 |
| java 명령 | 일반적으로 제공 | 제공 |
| javac 컴파일러 | 일반적으로 제공하지 않음 | 제공 |
| 선택하는 상황 | 앱에서 호환되는 외부 런타임을 요구할 때 | 학습, 소스 빌드, 개발 작업 |
| 다운로드 여부 | 공급자·버전·운영체제에 따라 다름 | 공급자와 지원 플랫폼에 맞춰 선택 |
이 표는 일반적인 실행 전용 패키지와 개발 키트의 역할을 비교한 것입니다. 사용자 정의 런타임은 선택한 모듈에 따라 구성이 달라지므로 이름만 보고 모든 라이브러리나 도구가 포함되어 있다고 가정하지 않습니다.
최신 JDK에도 JRE 폴더가 들어 있나요?
“JDK 안에 JRE가 있다”는 표현은 실행 기능까지 제공한다는 뜻으로는 이해할 수 있지만, 현재 JDK의 폴더 구조를 그대로 설명하지는 못합니다. JDK 8과 그 이전에는 JDK 내부에 jre/ 디렉터리가 있었고, JDK 9에서 모듈형 런타임 구조로 바뀌었습니다. Oracle은 JDK 11부터 별도의 JRE·Server JRE 다운로드를 제공하지 않는다고 안내합니다. Oracle JDK 11 마이그레이션 문서가 배포 방식과 디렉터리 구조의 변화를 설명합니다.
그러나 모든 공급자가 JRE 배포를 중단한 것은 아닙니다. Eclipse Temurin 다운로드 페이지에는 JDK/JRE 패키지 구분이 있으므로 필요한 버전과 운영체제에서 실제 제공하는 패키지를 확인하세요. 특정 회사의 변경을 Java 전체의 규칙으로 확대하면 설치 안내가 부정확해질 수 있습니다.
개발자는 JDK의 jlink로 필요한 모듈과 의존성을 묶은 전용 런타임을 만들 수도 있습니다. 이런 런타임을 앱과 함께 배포하면 사용자가 공용 JRE를 따로 준비할 필요를 줄일 수 있지만, 포함된 모듈과 업데이트 관리에 대한 책임은 배포자에게 있습니다. jlink 공식 문서는 사용자 정의 런타임의 생성과 업데이트 책임을 안내합니다.
어떤 패키지와 버전을 선택해야 하나요?
- 자바 학습과 개발: 강좌나 프로젝트가 요구하는 버전의 JDK를 선택합니다. 빌드 도구와 라이브러리의 지원 범위도 함께 확인합니다.
- 완성된 앱 실행: 앱의 설치 안내에서 필요한 Java 버전과 외부 런타임 필요 여부를 확인합니다. 앱에 런타임이 포함되어 있으면 시스템 Java를 바꿔도 그 앱은 다른 런타임을 사용할 수 있습니다.
- 서버 배포: 앱이 요구하는 모듈, 운영체제와 CPU 구조에 맞는 런타임을 선택합니다. 빌드를 같은 서버에서 수행하거나 JDK 도구가 필요한 작업이 있으면 JDK가 필요할 수 있습니다.
버전 숫자가 더 크다는 이유만으로 앱의 요구 조건을 충족한다고 단정하지 않습니다. 예를 들어 Java 21용으로 컴파일한 클래스 파일을 Java 17 런타임이 읽지 못할 수 있습니다. 반대로 예전 프로그램을 새 Java에서 실행할 때도 제거된 기능과 라이브러리의 호환성을 확인해야 합니다.
자체 소스를 이전 Java용으로 빌드해야 한다면 javac --release 옵션을 검토할 수 있습니다. 이 옵션은 지원되는 대상 버전의 언어·API·클래스 파일을 기준으로 컴파일하지만, 외부 의존성까지 자동으로 호환되게 바꾸지는 않습니다. 대상 버전의 실제 런타임에서도 실행을 확인해야 합니다.
설치한 JDK와 실행 경로 확인하기
공식 배포 페이지에서 패키지 종류(JDK/JRE), Java 버전, 운영체제와 CPU 구조(x64 또는 ARM64 등)를 먼저 선택합니다. 다운로드 파일의 검증값을 제공한다면 해시값으로 다운로드 파일을 확인하는 방법도 함께 활용할 수 있습니다.
Windows에서 설치하고 확인하기
Eclipse Temurin의 MSI 설치 프로그램을 사용하는 경우 Custom Setup 화면에서 설치 위치와 기능을 선택합니다. 명령줄 사용에는 PATH 추가 기능이 도움이 되고, 빌드 도구에서 필요하면 JAVA_HOME 설정 기능도 선택합니다. 설치 화면의 기능은 Temurin Windows 설치 안내에서 확인할 수 있습니다. 설치를 마친 뒤 열려 있던 터미널을 닫고 새로 엽니다.
java -version
javac -version
두 명령이 모두 실행되고 의도한 Java 주 버전을 가리키는지 확인합니다. java -version만 성공하면 실행 기능은 찾았지만 컴파일러는 찾지 못한 상태일 수 있습니다. 여러 Java가 설치되어 있다면 PowerShell에서 다음 명령으로 실제 선택되는 경로를 확인합니다.
Get-Command java,javac | Select-Object Name,Source
PATH는 터미널이 실행 파일을 찾는 경로 목록이고, JAVA_HOME은 일부 개발 도구가 JDK 위치를 찾을 때 사용하는 환경 변수입니다. JAVA_HOME에는 JDK의 루트 폴더를 지정하며 bin까지 붙이지 않습니다. 두 설정이 다른 JDK를 가리키면 터미널과 빌드 도구가 서로 다른 Java를 사용할 수 있습니다.
macOS와 Linux에서 확인하기
운영체제에 맞는 설치 프로그램이나 패키지를 사용하고, 실제 절차는 Temurin 운영체제별 설치 안내에서 확인합니다. 설치 뒤 java -version과 javac -version을 실행합니다. 셸이 찾는 명령의 위치는 다음처럼 확인할 수 있습니다.
command -v java
command -v javac
이 결과가 심볼릭 링크나 버전 선택 도구의 경로일 수도 있으므로 경로 이름만 보고 버전을 단정하지 않습니다. IDE의 프로젝트 JDK 설정과 실제 빌드 결과도 함께 확인하세요. 기존 앱이 사용하던 Java를 바로 삭제하기보다 프로젝트별로 새 JDK를 지정해 동작을 먼저 확인하는 편이 되돌리기 쉽습니다.
컴파일과 실행으로 역할 확인하기
JDK가 준비되었다면 빈 작업 폴더에 아래 코드를 HelloWorld.java로 저장합니다. 파일 이름의 대소문자를 클래스 이름과 같게 하고, .java.txt가 되지 않았는지 확인합니다. 패키지 선언과 외부 라이브러리가 없는 예제입니다.
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Java!");
}
}
터미널에서 그 파일이 있는 폴더로 이동한 뒤 다음 두 명령을 순서대로 실행합니다.
javac HelloWorld.java
java -cp . HelloWorld
첫 번째 명령은 클래스 파일을 만들고, 두 번째 명령은 현재 폴더(.)에서 HelloWorld 클래스를 찾아 실행합니다. 클래스 실행에는 .class 확장자를 붙이지 않습니다. 예상 출력은 다음과 같습니다.
Hello, Java!
JDK 11 이상에서는 java HelloWorld.java처럼 소스 파일을 직접 실행하는 방식도 사용할 수 있습니다. 이 경우 내부에서 컴파일하므로 java라는 명령 이름만 보고 실행 전용 JRE에서도 가능하다고 판단하면 안 됩니다. 여기서는 소스와 클래스 파일의 차이를 보기 위해 두 단계로 실행했습니다. 실행 방식의 조건은 java 명령의 소스 파일 실행 설명에서 확인할 수 있습니다.
클래스 파일을 실행 가능한 JAR 파일로 묶어 비교하려면 같은 폴더에서 다음 명령을 실행합니다. 먼저 앞의 컴파일로 HelloWorld.class가 만들어져 있어야 합니다.
jar --create --file hello.jar --main-class HelloWorld HelloWorld.class
java -jar hello.jar
jar로 묶는 작업에는 개발 도구가 필요하고, 완성된 이 JAR의 실행에는 호환되는 런타임이 필요합니다. 다른 앱의 JAR는 추가 라이브러리나 실행 옵션이 필요할 수 있으므로 이 단순 예제와 동일하게 취급하지 않습니다. 파일 생성 옵션은 jar 공식 명령 문서에서 확인할 수 있습니다.
설치했는데 실행되지 않을 때 확인할 점
| 증상 | 확인할 내용 | 해결 방향 |
|---|---|---|
| java 또는 javac 명령을 찾지 못함 | 실행 파일이 있는지, PATH가 해당 JDK의 bin을 포함하는지 확인 | 새 터미널을 열고 의도한 JDK의 실행 파일 경로로도 확인 |
| java는 되지만 javac는 안 됨 | 실행 전용 런타임만 설치했거나 명령 경로가 섞였는지 확인 | 개발용 JDK를 설치하거나 이미 있는 JDK의 경로를 지정 |
| UnsupportedClassVersionError | 실행 Java가 클래스 파일의 버전을 지원하는지 확인 | 앱이 요구하는 호환 런타임 사용; 자체 코드라면 대상 버전으로 다시 빌드 |
| Could not find or load main class | 클래스 이름, 작업 폴더, 클래스 경로 확인 | 예제에서는 HelloWorld.class가 있는 폴더에서 java -cp . HelloWorld 실행 |
| IDE에서는 되지만 터미널에서는 실패 | 프로젝트 JDK와 터미널의 java·javac가 같은 설치를 가리키는지 확인 | IDE, PATH, JAVA_HOME과 빌드 도구의 JDK 선택을 각각 확인 |
문제를 해결할 때는 “Java를 설치했다”는 사실보다 지금 어떤 실행 파일을 사용하고 있는지를 먼저 확인하는 것이 도움이 됩니다. 명령 경로와 버전이 맞고 간단한 예제가 실행된다면, 그다음에는 해당 앱의 라이브러리와 실행 옵션을 점검할 수 있습니다.




