도입
Java 프로그램을 만들고, 테스트하고, 실행하고, 문서화하고, 패키징하는 데 필요한 도구를 묶어 제공하는 Java 개발 환경입니다.
Java 프로그램을 작성한 뒤 컴파일하고, 실행하고, 문서화하고, 패키징하고, 의존성을 분석하고, 필요하면 커스텀 런타임 이미지까지 만들 수 있는 도구 모음을 포함한 개발 환경입니다.
또한 OpenJDK의 JDK Project는 Java SE 플랫폼의 오픈소스 기준 구현을 계속 만들어 내는 장기 프로젝트이며, 이 프로젝트는 기능 릴리스를 6개월 주기의 시간 기반 모델로 내보냅니다.
그래서 JDK를 이해한다는 것은 단순히 컴파일러 하나를 아는 것이 아니라, Java 플랫폼 전체의 개발, 실행 도구 체계를 이해하는 것에 가깝습니다.
필요성
Java를 공부하다 보면 javac, java, jar, javadoc, jshell 같은 명령을 따로따로 배우게 됩니다.
하지만 이 도구들은 각각 흩어진 것이 아니라 모두 JDK 안에서 유기적으로 연결됩니다.
JDK를 이해하면 “소스 코드 작성 → 컴파일 → 실행 → 문서화 → 패키징 → 배포”의 전체 흐름이 선명해집니다.
- Java 프로그램이 실제로 어떻게 빌드되는지 이해할 수 있다.
- 컴파일 단계와 실행 단계를 구분할 수 있다.
- JVM, JRE, JDK 관계를 정확히 정리할 수 있다.
- 도구별 역할을 나눠 디버깅하기 쉬워진다.
- 모듈, 배포, 런타임 이미지 같은 현대 Java 흐름을 이해할 수 있다.
정의
Oracle의 공식 JDK 설명은 일관되게 JDK를 “Java 프로그래밍 언어를 사용해 애플리케이션을 구축하기 위한 개발 환경”으로 설명합니다. 또한 JDK는 Java 프로그램을 개발하고 테스트하고 실행하는 데 유용한 도구들을 포함한다고 안내합니다.
:contentReference[oaicite:5]{index=5}
한편 Java SE API 문서에서는 Java SE 핵심 API와 JDK 전용 API를 구분하며, Java SE 핵심 모듈은 이름이 java로 시작하고, JDK에 특화된 API는 이름이 jdk로 시작한다고 설명합니다. 즉, JDK는 단순 런타임이 아니라 플랫폼 + 개발용 도구 + JDK 전용 기능을 함께 다루는 층위입니다.
:contentReference[oaicite:6]{index=6}
JDK · JVM · JRE 관계
| 개념 | 핵심 의미 | 어떻게 이해하면 좋은가 |
|---|---|---|
| JVM | Java 바이트코드를 실행하는 가상 머신 | java 명령은 JVM을 시작해 클래스를 로드하고 main()을 호출한다 |
| JRE | 역사적으로 Java 실행 환경을 가리키던 개념 | 하지만 JDK 11 이상에서는 별도 JRE 이미지가 없다 |
| JDK | 개발 환경 + 실행 관련 도구 모음 | 컴파일, 실행, 문서화, 패키징, 분석, 런타임 이미지 제작까지 포함한다 |
:contentReference[oaicite:7]{index=7}
예전 설명에서는 흔히 “JDK = JRE + 개발 도구”라고 정리했지만, Oracle의 마이그레이션 문서는 JDK 11 and later does not have the JRE image라고 분명히 적고 있습니다. 따라서 현대 Java 기준에서는 JDK를 그냥 “개발과 실행을 위한 전체 도구 환경”로 이해하는 편이 더 정확합니다.
:contentReference[oaicite:8]{index=8}
JDK가 포함하는 것
Oracle의 Tools and Commands Reference는 JDK 도구들을 기능별로 분류해 설명합니다. 여기에는 메인 개발 도구뿐 아니라 언어 셸, 보안 도구, 모니터링 도구, 트러블슈팅 도구까지 포함됩니다. 즉, JDK는 단순히 javac 하나만 뜻하지 않습니다.
:contentReference[oaicite:9]{index=9}
| 도구 분류 | 대표 도구 | 무엇을 하나 |
|---|---|---|
| 메인 개발 도구 | javac, java, jar, javadoc, jlink, jdeps |
빌드, 실행, 문서화, 패키징, 의존성 분석 |
| 언어 셸 | jshell |
대화형으로 Java 코드 실험 |
| 보안 도구 | keytool, jarsigner |
키 저장소 관리, JAR 서명·검증 |
| 모니터링 / 문제 해결 | jcmd, jdb, jhsdb, jconsole |
JVM 상태 점검, 디버깅, 크래시 분석 |
:contentReference[oaicite:10]{index=10}
대표 도구
| 도구 | 핵심 역할 | 실무 감각으로 이해하면 |
|---|---|---|
| javac | Java 소스를 바이트코드 클래스 파일로 컴파일 | 소스 → .class 변환기 |
| java | JVM을 시작해 클래스를 로드하고 main() 실행 |
실행 런처 |
| javadoc | Java 소스의 선언과 문서 주석을 읽어 HTML 문서 생성 | API 문서 생성기 |
| jar | 클래스와 리소스를 아카이브로 묶고 다룸 | 배포용 묶음 도구 |
| jshell | Java 선언, 문장, 표현식을 대화형으로 실행하는 REPL | 빠른 실험실 |
| jdeps | 클래스 / JAR의 패키지·클래스 수준 의존성 분석 | 의존성 분석기 |
| jlink | 모듈과 의존성으로 커스텀 런타임 이미지 생성 | 맞춤 런타임 제작기 |
| jpackage | 필요한 런타임까지 포함한 앱 이미지 / 플랫폼별 패키지 생성 | 설치형 배포 도구 |
:contentReference[oaicite:11]{index=11}
javac + java만 써도 충분하지만, 프로젝트가 커지면 jar, javadoc, jdeps, jlink, jpackage의 역할을 구분할 줄 알아야 빌드와 배포 흐름이 덜 헷갈립니다.:contentReference[oaicite:12]{index=12}
컴파일부터 실행까지
Java 소스 코드(.java) ↓ javac ↓ 바이트코드 클래스 파일(.class) ↓ java ↓ JVM 시작 ↓ 클래스 로드 + main() 호출 ↓ 프로그램 실행
:contentReference[oaicite:13]{index=13}
Oracle 문서는 javac가 Java 클래스와 인터페이스 정의를 읽어 바이트코드와 클래스 파일로 컴파일한다고 설명하고, java 명령은 JVM을 시작하고 지정한 클래스를 로드해 그 클래스의 main() 메서드를 호출한다고 설명합니다. 즉, JDK 안에서도 컴파일 단계와 실행 단계는 분명히 분리되어 있습니다.
:contentReference[oaicite:14]{index=14}
또한 현대 JDK의 java 명령은 source-file mode를 통해 단일 .java 파일을 직접 실행할 수도 있습니다. 공식 문서는 이 모드에서 소스 파일이 메모리상에서 컴파일된 뒤 실행되는 것처럼 동작한다고 설명합니다.
:contentReference[oaicite:15]{index=15}
Java SE와 JDK의 차이
Oracle의 Java API 문서는 Java SE와 JDK를 분명히 나눕니다. 핵심 Java SE API는 모듈 이름이 java.*로 시작하고, JDK에 특화된 API는 jdk.*로 시작합니다. 또한 Oracle 문서는 JDK API가 모든 Java SE 구현에 반드시 존재한다고 보장하지 않는다고 명시합니다.
:contentReference[oaicite:16]{index=16}
| 구분 | 문서상 특징 | 대표 감각 |
|---|---|---|
| Java SE API | java.* 모듈 중심 |
플랫폼 핵심 표준 API |
| JDK API | jdk.* 모듈 중심 |
개발 키트에 특화된 API와 도구 관련 기능 |
:contentReference[oaicite:17]{index=17}
릴리스 모델과 LTS
OpenJDK JDK Project는 기능 릴리스를 6개월마다 내보내는 시간 기반 모델을 따른다고 설명합니다. Oracle의 Java SE Support Roadmap은 현재 Java SE 8, 11, 17, 21, 25를 LTS 릴리스로 안내하고 있으며, 이후 LTS를 2년 주기로 계획한다고 적고 있습니다.
:contentReference[oaicite:18]{index=18}
| 구분 | 의미 | 실무 감각 |
|---|---|---|
| 기능 릴리스 | 새 언어/라이브러리/도구 기능을 담는 릴리스 | 새 기능을 빨리 쓰고 싶을 때 주목 |
| LTS 릴리스 | 장기 지원이 제공되는 기준 릴리스 | 실무 서버나 조직 표준 버전 선택에 자주 사용 |
:contentReference[oaicite:19]{index=19}
자주 하는 오해
- JDK = Java 언어 자체라고 생각함 → JDK는 언어가 아니라 개발 환경과 도구 모음입니다.
- JDK = 항상 JRE + 도구라고 생각함 → 역사적으로는 맞았지만 JDK 11 이후에는 별도 JRE 이미지가 없습니다.
- JDK는 javac만 알면 된다고 생각함 → 실제로는 실행, 문서화, 패키징, 분석, 디버깅 도구까지 포함합니다.
- java 명령은 무조건 이미 컴파일된 클래스만 실행한다고 생각함 → 현대 JDK는 단일 소스 파일 실행 모드도 제공합니다.
- 모든 Java API가 다 표준 Java SE API라고 생각함 → JDK 전용 API도 별도로 존재합니다.
:contentReference[oaicite:20]{index=20}
공부 루틴
- JDK / JVM / JRE 차이를 먼저 정리한다.
- javac와 java 역할을 분리해서 이해한다.
- 소스 코드가 .class로 바뀌는 흐름을 직접 실행해 본다.
- jar와 javadoc로 배포와 문서화 흐름을 경험해 본다.
- 프로젝트가 커지면 jdeps, jlink, jpackage까지 확장한다.
- 버전 선택에서는 기능 릴리스와 LTS를 구분해 본다.
:contentReference[oaicite:21]{index=21}
디버깅과 분석 포인트
:contentReference[oaicite:22]{index=22}
요약
- ✅ JDK는 Java 애플리케이션 개발을 위한 공식 개발 환경이다.
- ✅
javac,java,jar,javadoc,jshell,jdeps,jlink,jpackage같은 핵심 도구를 포함한다. - ✅ 현대 Java에서는 JDK 11 이후 별도 JRE 이미지가 없다는 점을 같이 알아야 한다.
- ✅
javac는 바이트코드 클래스 파일을 만들고,java는 JVM을 시작해 프로그램을 실행한다. - ✅ Java SE 핵심 API와 JDK 전용 API는 문서상에서 분리되어 있다.
- ✅ OpenJDK는 Java SE의 오픈소스 기준 구현 프로젝트이며, 기능 릴리스는 6개월 주기를 따른다.
- ✅ 실무에서는 기능 릴리스와 LTS 릴리스를 구분해서 버전을 선택하는 습관이 중요하다.
:contentReference[oaicite:23]{index=23}