JDK
JDK 는 자바로 짠 코드를 컴파일하고 실행할 수 있게 해 주는 프로그램 묶음입니다. 개발하는 컴퓨터에 이것 하나를 깔면 소스를 짜서 바로 돌려 볼 수 있습니다. 자바를 쓰는 사람이 제일 먼저 내려받는 물건입니다.
쉽고 빠른 이해
JDK 는 자바 코드를 컴파일하고 실행하는 데 필요한 프로그램을 한 벌로 묶어 내주는 꾸러미입니다. 깔고 나면 터미널에 소스를 컴파일하는 명령과 그 결과를 실행하는 명령이 생깁니다.
자바 코드는 사람이 쓴 소스 그대로는 돌지 않습니다. 기계가 읽을 형태로 한 번 바꿔야 합니다. 바뀐 것을 읽어 주는 실행기도 있어야 합니다. 여기에 미리 만들어진 표준 라이브러리까지 따로 구해다 짝을 맞추는 것은 번거롭습니다. 그 한 벌을 맞춰서 내주는 것이 JDK 입니다.
어떻게 도는가:
- 소스 파일을 컴파일 명령에 넘깁니다
- 컴파일러가 실행기용 파일을 만들어 냅니다
- 실행 명령이 실행기를 띄워 그 파일을 읽힙니다
대가도 있습니다. 자바가 판을 올리면 JDK 도 그에 맞는 것으로 갈아야 합니다. 프로젝트마다 요구하는 판이 달라 한 컴퓨터에 여러 벌을 두고 골라 쓰는 일이 잦습니다.
짜는 컴퓨터에는 JDK 를 둡니다. 남이 만든 것을 돌리기만 하는 서버에는 실행에 드는 것만 있으면 됩니다.
상세
JDK 는 Java Development Kit 의 줄임말입니다. 자바 프로그램을 만드는 사람에게 필요한
프로그램을 한 곳에 모아 배포하는 꾸러미를 가리킵니다. 터미널에서 javac Hello.java 로
소스를 컴파일하고 java Hello 로 돌려 보는 그 두 명령이, JDK 를 깔면 생기는 것입니다.
자바는 소스를 그대로 실행하는 언어가 아닙니다. 소스를 한 번 바꿔야 합니다. 바뀐 것을 읽어 주는 실행기가 따로 있어야 합니다. JDK 는 그 둘을 함께 담습니다. 코드를 짜는 사람이 부품을 하나씩 구해다 맞추지 않아도 됩니다.
안에 들어 있는 것
무엇이 같이 딸려 오는지부터 봅니다. 이름은 JDK 를 만들어 내놓는 곳마다 조금씩 다를 수 있습니다. 그래도 아래 넷은 어느 JDK 에나 있습니다.
| 들어 있는 것 | 하는 일 |
|---|---|
| 컴파일러 | 자바 소스를 실행기가 읽는 형태로 바꿉니다 |
| 실행기 | 그 결과를 읽어 프로그램을 돌립니다 |
| 표준 라이브러리 | 문자열·컬렉션·입출력처럼 자주 쓰는 것을 미리 만들어 둔 클래스 묶음입니다 |
| 보조 도구 | 결과를 한 파일로 묶거나, 문서를 뽑거나, 실행을 멈춰 가며 들여다봅니다 |
컴파일러·실행기·표준 라이브러리 셋은 자바로 짠 것을 돌려 보는 데 반드시 필요합니다. 보조 도구는 없어도 프로그램은 돕니다. 다만 손으로 하기 번거로운 일을 대신해 줍니다. 컴파일된 파일 안을 열어 보는 javap 가 그런 도구입니다.
넷이 하는 몫은 두 갈래로 갈립니다. 실행기와 표준 라이브러리는 이미 만들어진 프로그램을 돌리기만 할 때도 있어야 합니다. 컴파일러와 보조 도구는 코드를 짜는 동안에만 씁니다. 이 두 갈래를 그리면 이렇습니다.
flowchart TD
subgraph JDK
A["컴파일러"]
B["보조 도구"]
subgraph 실행에 드는 것
C["실행기"]
D["표준 라이브러리"]
end
end
안쪽 상자만 있어도 남이 만든 프로그램을 돌릴 수는 있습니다. 새로 짜지는 못합니다.
컴파일러와 실행기가 나누어 하는 일
자바에서 컴파일은 소스를 기계어로 바꾸는 일이 아닙니다. javac 가 만들어 내는 것은 바이트코드입니다. 실행기 하나만 이해하는 중간 형태의 명령입니다. 바이트코드는 클래스 파일이라는 파일에 담깁니다.
그 파일을 읽어 실제로 돌리는 것이 앞에서 실행기라고 부른 물건입니다. 정식 이름은 JVM(Java Virtual Machine, 자바 가상 머신)입니다. 실행기는 바이트코드를 한 줄씩 해석해 자기가 도는 운영체제와 프로세서에 맞는 동작으로 옮깁니다. 소스를 고치지 않고도 다른 운영체제에서 같은 클래스 파일을 돌릴 수 있는 것이 이 구조 덕분입니다.
java Hello 같은 실행 명령이 프로그램을 직접 돌리는 것은 아닙니다. 실행 명령은 실행기를
띄우고 읽을 클래스 파일을 넘깁니다. 소스에서 실행까지를 그리면 이렇습니다.
flowchart TD
A["Hello.java · 사람이 쓴 소스"] --> B["javac 가 컴파일"]
B --> C["Hello.class · 바이트코드"]
C --> D["실행 명령이 실행기를 띄워 읽힌다"]
그림에서 볼 것은 소스가 곧바로 돌지 않는다는 점입니다. 클래스 파일이라는 중간 결과물이 한 번 만들어집니다. 실행기가 읽는 것은 소스가 아니라 그 중간 결과물입니다.
실행할 때 실행기는 필요한 클래스 파일을 디스크에서 찾아 읽어 들입니다. 어느 폴더와 어느 묶음 파일을 뒤질지는 클래스패스가 정합니다. 클래스패스가 잘못 잡히면 컴파일은 통과합니다. 그러고도 실행할 때 클래스를 못 찾습니다.
실행만 하는 환경과 어떻게 다른가
만든 프로그램을 서버에서 돌리기만 할 때는 컴파일러가 필요 없습니다. 그래서 실행에 드는 것만 담은 갈래를 따로 부릅니다. JRE(Java Runtime Environment, 자바 실행 환경)입니다.
| JRE | JDK | |
|---|---|---|
| 실행기 | 있습니다 | 있습니다 |
| 표준 라이브러리 | 있습니다 | 있습니다 |
| 컴파일러 | 없습니다 | 있습니다 |
| 보조 도구 | 없습니다 | 있습니다 |
JDK 는 JRE 가 가진 것에 개발용 도구를 얹은 묶음입니다. 그래서 개발자 컴퓨터에는 JDK 를 깔았습니다. 실행만 하는 서버에는 JRE 만 두었습니다. 어느 컴퓨터에 무엇을 깔지는 이 구분으로 정합니다.
판과 배포판을 고르는 일
자바는 언어와 실행기의 규격을 문서로 정해 둡니다. 그 규격에 맞는 JDK 를 여러 곳이 각자 만들어 내놓습니다. 이렇게 각자 만들어 내놓은 것을 배포판이라고 부릅니다. 소스가 공개된 OpenJDK 가 그 바탕입니다. 누구나 가져다 쓸 수 있게 소스를 공개해 둔 JDK 입니다. 여러 회사와 재단이 이것을 빌드해 자기 이름으로 배포합니다.
고를 때 보는 것은 대개 셋입니다. 어느 판인지, 그 판을 얼마나 오래 고쳐 주는지, 쓰는 데 어떤 조건이 붙는지입니다. 셋째는 라이선스를 말합니다. 배포판마다 쓸 수 있는 범위와 돈을 내야 하는지가 달라서, 회사에서 쓸 것을 고를 때 이것을 먼저 봅니다.
판을 고르는 일은 프로젝트에 매여 있습니다. 그래서 한 컴퓨터에 여러 벌을 깔아 두고 갈아 끼워 씁니다.
어느 JDK 를 쓸지는 환경 변수 JAVA_HOME 이 가리킵니다. 컴파일 도구와 실행 도구는 이
값을 보고 자기가 쓸 JDK 를 정합니다. 여러 벌을 깔았다면 이 값이 가리키는 것이 곧 지금 쓰는
판입니다.
따로 갖춰야 하는 도구
JDK 는 소스 하나를 컴파일하고 하나를 실행하는 데까지를 맡습니다. 그 바깥의 일은 다른 도구가 받습니다.
- 라이브러리를 내려받고 컴파일 순서를 챙기는 일은 Gradle 이나 Maven 같은 빌드 도구가 합니다
- 코틀린 소스는 JDK 의 컴파일러가 못 읽습니다. kotlinc 가 따로 컴파일합니다
- 편집기와 자동 완성은 JDK 에 없습니다. 통합 개발 환경(IDE, Integrated Development Environment)을 따로 씁니다
코틀린처럼 다른 언어로 짠 코드도 결국 클래스 파일이 되어 실행기 위에서 돕니다. 컴파일하는 쪽만 갈립니다. 실행하는 쪽은 같습니다. 그래서 코틀린 프로젝트에도 JDK 가 필요합니다.
관련 항목
JDK 안에 들어 있는 구성 요소
javac · JVM · JRE · 표준 라이브러리 · javap · javadoc · jar · jdb
JDK 가 만들어 내거나 읽어 들이는 파일 형식
클래스 파일 · 바이트코드 · 소스 코드 · JAR 파일 · 모듈
JDK 로 실행할 때 함께 정하는 설정 항목
클래스패스 · 모듈 경로 · 환경 변수 · 힙 크기
JDK 가 컴파일하거나 실행해 주는 언어
JDK 바깥에서 따로 갖추는 개발 도구
Gradle · Maven · kotlinc · 통합 개발 환경 · 정적 분석 도구
JDK 판을 내놓는 프로젝트와 그 규격
OpenJDK · Java SE · 자바 언어 명세 · JVM 명세
JVM 안에서 프로그램이 도는 동안 벌어지는 처리 단계
클래스 로딩 · 가비지 컬렉션 · JIT 컴파일 · 힙 · 스택
JDK 가 속하는 상위 분류
컴파일러 · 가상 머신 · 런타임 · 소프트웨어 개발 키트 · 개발
다른 이름: Java Development Kit · 자바 개발 키트