사전 JDK
구현체

JDK

gabury1

JDK 는 자바로 짠 코드를 컴파일하고 실행할 수 있게 해 주는 프로그램 묶음입니다. 개발하는 컴퓨터에 이것 하나를 깔면 소스를 짜서 바로 돌려 볼 수 있습니다. 자바를 쓰는 사람이 제일 먼저 내려받는 물건입니다.

쉽고 빠른 이해

JDK 는 자바 코드를 컴파일하고 실행하는 데 필요한 프로그램을 한 벌로 묶어 내주는 꾸러미입니다. 깔고 나면 터미널에 소스를 컴파일하는 명령과 그 결과를 실행하는 명령이 생깁니다.

자바 코드는 사람이 쓴 소스 그대로는 돌지 않습니다. 기계가 읽을 형태로 한 번 바꿔야 합니다. 바뀐 것을 읽어 주는 실행기도 있어야 합니다. 여기에 미리 만들어진 표준 라이브러리까지 따로 구해다 짝을 맞추는 것은 번거롭습니다. 그 한 벌을 맞춰서 내주는 것이 JDK 입니다.

어떻게 도는가:

  1. 소스 파일을 컴파일 명령에 넘깁니다
  2. 컴파일러가 실행기용 파일을 만들어 냅니다
  3. 실행 명령이 실행기를 띄워 그 파일을 읽힙니다

대가도 있습니다. 자바가 판을 올리면 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 · 자바 개발 키트