Java와 JDK 25 설치하기
Windows·macOS·Linux에 JDK 25를 설치하고, 터미널에서 java와 javac가 같은 버전으로 실행되는지 확인한 뒤 실습 폴더를 만듭니다.
Java 프로그램은 메모장 같은 편집기로도 쓸 수 있습니다. 하지만 그렇게 쓴 글은 아직 사람이 읽는 문서일 뿐이라서, 실행하려면 그 글을 컴퓨터가 처리할 수 있는 형태로 바꾸고 실행해 주는 도구가 필요합니다. 그 도구 묶음이 JDK입니다.
1장에서는 JDK 설치부터 시작해 짧은 프로그램을 컴파일하고 실행하고, 오류 메시지를 읽고, 실행할 때 값을 넘겨받는 데까지 차례로 진행합니다. 그 첫 단계인 이 글에서는 JDK를 설치하고, 터미널에서 Java 명령 두 개가 제대로 동작하는지 확인한 다음, 앞으로 예제를 저장할 실습 폴더를 만듭니다. 프로그래밍 경험이 없어도 따라올 수 있도록 명령마다 무엇을 하는지 설명합니다.
자주 나올 용어 세 가지를 먼저 정리해 두겠습니다. 소스 코드(source code)는 사람이 Java 문법에 맞춰 쓴 글이며, 확장자가 .java인 파일에 저장합니다. 컴파일(compile)은 이 소스 코드를 JVM(Java Virtual Machine, 자바 가상 머신)이라는 실행 환경이 읽을 수 있는 .class 파일로 바꾸는 과정입니다. 터미널(terminal)은 마우스 대신 글자로 명령을 입력해 컴퓨터를 다루는 프로그램입니다. 세 용어 모두 이 장에서 직접 명령을 실행하면서 다시 만나게 됩니다.
Java와 JDK, 그리고 두 명령
Java라는 이름은 두 가지를 함께 가리킵니다. 하나는 프로그램을 작성하는 언어이고, 다른 하나는 그 프로그램을 실행하는 환경입니다. 둘을 이어 주는 것이 JDK(Java Development Kit)입니다. JDK에는 소스를 컴파일하는 프로그램과 컴파일된 프로그램을 실행하는 프로그램이 들어 있고, 화면 출력이나 파일 읽기처럼 자주 쓰는 기능을 미리 만들어 둔 표준 라이브러리도 함께 들어 있습니다. 이 장에서 직접 입력할 명령은 그중 다음 두 개입니다.
| 명령 | 역할 | 받는 것 | 만드는 것 |
|---|---|---|---|
javac | 컴파일러(compiler) | .java 소스 파일 | .class 파일 |
java | 실행기(launcher) | 실행할 클래스 이름 | JVM에서 실행되는 프로그램 |
이름이 한 글자 차이라 헷갈리기 쉬운데, javac 끝의 c는 compiler의 c라고 기억하면 됩니다. 두 명령은 같은 JDK에 들어 있으므로, 설치가 제대로 됐다면 같은 버전을 알려 줘야 합니다. 그래서 이 글의 목표는 터미널에서 java와 javac가 모두 버전 25를 출력하게 만드는 것입니다. JDK 안의 구성과 JVM이 하는 일은 이 장의 세 번째 글에서 자세히 다룹니다.
어떤 JDK를 설치할까
이 교재는 JDK 25를 기준으로 합니다. Java는 매년 3월과 9월, 즉 6개월마다 새 기능 버전을 내놓고, 그중 일부를 LTS(Long-Term Support, 장기 지원) 버전으로 정해 여러 해 동안 보안 업데이트를 제공합니다. 2025년 9월에 나온 JDK 25는 LTS 버전이며, 2026년 10월 현재 가장 최근의 LTS입니다. 다운로드 페이지에는 25보다 높은 번호가 먼저 보일 수 있지만, 이 교재를 따라 할 때는 25를 고르세요. 버전이 다르면 일부 예제의 동작이나 출력이 본문과 달라질 수 있습니다.
JDK는 한 회사만 만드는 것이 아닙니다. Eclipse Temurin, Oracle JDK, Amazon Corretto, Azul Zulu, Microsoft Build of OpenJDK처럼 여러 배포판(distribution)이 있고, 대부분 같은 OpenJDK 소스 코드를 바탕으로 만들어집니다. 그래서 Java SE 25 규격을 구현한 JDK라면 어느 것을 골라도 이 교재의 예제를 똑같이 실행할 수 있습니다. 배포판마다 다른 것은 업데이트를 얼마나 오래 제공하는지, 어떤 라이선스 조건으로 쓰는지 같은 운영 정책입니다. 이 글에서는 무료로 쓸 수 있고 세 운영체제를 모두 지원하는 Eclipse Temurin을 예로 설치합니다.
운영체제별로 설치하기
설치 방법은 운영체제마다 다르므로 자신이 쓰는 운영체제 부분만 읽으면 됩니다. 어느 운영체제든 마지막 단계는 같습니다. 설치가 끝나면 열려 있던 터미널을 모두 닫고 새로 엽니다. 터미널은 시작할 때 환경 변수(environment variable), 즉 운영체제가 프로그램에 넘겨 주는 설정 값을 복사해 두고 그 뒤로는 다시 읽지 않습니다. 그래서 설치 전에 열어 둔 창에서는 방금 설치한 JDK가 보이지 않을 수 있습니다. Visual Studio Code 같은 편집기 안에 들어 있는 터미널은 그 편집기가 시작될 때의 환경 변수를 물려받으므로, 편집기 자체를 완전히 종료했다가 다시 열어야 합니다.
Windows
Windows에서는 설치 프로그램(.msi)을 쓰는 방법이 가장 간단합니다. 설치 프로그램이 PATH 설정까지 해 주기 때문입니다. PATH는 터미널이 명령을 찾을 폴더 목록인데, 뒤에서 자세히 설명합니다.
- Adoptium 다운로드 페이지에서 운영체제는 Windows, 아키텍처는 x64, 패키지 종류는 JDK, 버전은 25를 고른 뒤
.msi파일을 내려받습니다. 아키텍처(architecture)는 컴퓨터에 들어 있는 CPU의 종류를 말합니다. 대부분의 PC는 x64이며, [설정]의 [시스템] > [정보]에 있는 '시스템 종류'에서 확인할 수 있습니다. 여기에 'ARM 기반 프로세서'라고 나오면 아키텍처로 aarch64를 고르고, 목록에 Windows용 aarch64 패키지가 없다면 Windows ARM용 설치 파일을 제공하는 Microsoft Build of OpenJDK의 JDK 25를 대신 설치합니다. - 내려받은 파일을 실행하고 안내를 따라갑니다. 설치할 기능을 고르는 화면에서 PATH 환경 변수를 갱신하는 항목은 기본으로 켜져 있으니 그대로 둡니다.
- 같은 화면에서 JAVA_HOME 환경 변수를 설정하는 항목은 기본으로 꺼져 있습니다. 이 교재의 실습에는 필요 없지만 나중에 IDE(통합 개발 환경, 코드 작성부터 실행까지 한 프로그램에서 하게 해 주는 도구)나 빌드 도구가 JDK 위치를 찾을 때 쓰므로, 항목 옆의 아이콘을 눌러 함께 설치하도록 바꿔 두어도 좋습니다.
- 설치가 끝나면 열려 있던 PowerShell 창을 모두 닫습니다. JDK는
C:\Program Files\Eclipse Adoptium아래에 설치됩니다.
winget(Windows 패키지 관리자)을 쓸 수 있다면 설치 파일을 내려받는 대신 PowerShell 창에서 다음 명령 한 줄로 같은 JDK를 설치할 수도 있습니다. PowerShell 창을 여는 방법은 다음 절에서 설명합니다. 설치가 끝나면 마찬가지로 새 PowerShell 창을 열고 아래의 버전 확인으로 넘어갑니다.
winget install EclipseAdoptium.Temurin.25.JDKmacOS
macOS에서는 설치 패키지(.pkg)를 씁니다. 먼저 Apple 메뉴의 '이 Mac에 관하여'에서 칩 또는 프로세서 항목을 확인합니다. Apple M1, M2 같은 Apple 칩이면 아키텍처로 aarch64를, Intel 프로세서면 x64를 고르면 됩니다.
- Adoptium 다운로드 페이지에서 운영체제는 macOS, 아키텍처는 앞에서 확인한 것, 패키지 종류는 JDK, 버전은 25를 고른 뒤
.pkg파일을 내려받습니다. - 내려받은 파일을 열고 안내를 따라 설치합니다.
- 설치가 끝나면 터미널을 닫고 다시 엽니다.
패키지는 JDK를 /Library/Java/JavaVirtualMachines/temurin-25.jdk에 설치합니다. macOS에는 처음부터 /usr/bin/java와 /usr/bin/javac라는 작은 연결 프로그램이 들어 있는데, 이 프로그램이 위 폴더에 설치된 JDK 가운데 하나를 골라 대신 실행해 줍니다. 그래서 macOS에서는 PATH를 직접 고칠 필요가 없습니다. 설치된 JDK가 여러 개면 기본으로 가장 높은 버전이 선택되며, 설치된 목록은 /usr/libexec/java_home -V로 볼 수 있습니다.
Linux
Linux에서는 Ubuntu, Fedora 같은 Linux 배포판에 들어 있는 패키지 관리자(프로그램을 내려받아 설치하고 관리하는 도구)로 설치합니다. 명령은 터미널에 입력하며, 터미널을 여는 방법은 다음 절에서 설명합니다. Ubuntu나 Debian 계열이라면 Adoptium의 패키지 저장소를 등록한 뒤 temurin-25-jdk 패키지를 설치합니다. 아래 명령은 Adoptium 공식 설치 안내를 따른 것이므로 한 줄씩 그대로 입력합니다. sudo는 명령을 관리자 권한으로 실행한다는 뜻입니다. 비밀번호를 물으면 사용자 계정의 비밀번호를 입력하는데, 입력한 글자가 화면에 보이지 않거나 별표로만 보여도 정상입니다.
sudo apt install -y wget apt-transport-https gpg
wget -qO - https://packages.adoptium.net/artifactory/api/gpg/key/public | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/adoptium.gpg > /dev/null
echo "deb https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update
sudo apt install temurin-25-jdkFedora, RHEL, CentOS에서는 저장소 설정 파일을 만든 뒤 dnf로 설치합니다. 첫 명령은 첫 줄부터 EOF라고 적힌 줄까지 여러 줄을 한 번에 붙여 넣습니다.
sudo tee /etc/yum.repos.d/adoptium.repo > /dev/null <<EOF
[Adoptium]
name=Adoptium
baseurl=https://packages.adoptium.net/artifactory/rpm/$(. /etc/os-release; echo $ID)/\$releasever/\$basearch
enabled=1
gpgcheck=1
gpgkey=https://packages.adoptium.net/artifactory/api/gpg/key/public
EOF
sudo dnf install temurin-25-jdk두 방법 모두 패키지가 java와 javac를 /usr/bin 아래에 연결해 주므로 보통은 PATH를 직접 고칠 필요가 없습니다. 다른 배포판이라면 Adoptium의 Linux 설치 안내를 참고하세요. 배포판이 자체 저장소로 제공하는 OpenJDK 패키지를 써도 되지만, 배포판 버전에 따라 25가 없을 수 있습니다.
터미널을 열고 java와 javac 확인하기
새 터미널을 여는 방법은 운영체제마다 다릅니다. 앞으로 '터미널'이라고 하면 Windows에서는 PowerShell 창을, macOS와 Linux에서는 터미널 앱의 창을 뜻합니다.
- Windows: 시작 메뉴에서 'PowerShell'을 검색해 Windows PowerShell을 엽니다. Windows 11의 '터미널' 앱도 기본으로 PowerShell 창을 엽니다.
- macOS: Spotlight(Command+Space)에서 '터미널'을 검색하거나, 응용 프로그램 폴더 안 유틸리티 폴더의 터미널을 엽니다.
- Linux: 응용 프로그램 메뉴에서 '터미널'을 찾습니다. Ubuntu에서는 Ctrl+Alt+T로도 열 수 있습니다.
창이 열리면 다음 두 명령을 한 줄씩 입력하고 Enter를 누릅니다. 두 명령은 세 운영체제에서 똑같습니다.
java -version
javac -version이 교재는 이렇게 명령이 같을 때는 한 번만 적습니다. 운영체제마다 명령이 다를 때는 Windows PowerShell 명령을 먼저 적고 macOS·Linux 명령을 따로 적습니다. 터미널 안에서 입력한 명령을 해석해 실행하는 프로그램을 셸(shell)이라고 하는데, macOS의 기본 셸인 zsh와 Linux에서 흔히 쓰는 bash는 이 교재에서 쓰는 명령을 같은 방식으로 처리합니다.
설치가 제대로 됐다면 다음과 비슷한 출력이 나옵니다. Temurin을 설치했을 때의 예이며, x와 y 자리에는 설치한 업데이트에 따라 실제 숫자와 날짜가 들어갑니다.
openjdk version "25.0.x" 20xx-xx-xx LTS
OpenJDK Runtime Environment Temurin-25.0.x+y (build 25.0.x+y-LTS)
OpenJDK 64-Bit Server VM Temurin-25.0.x+y (build 25.0.x+y-LTS, mixed mode, sharing)
javac 25.0.x처음 세 줄은 java -version의 출력이고 마지막 줄은 javac -version의 출력입니다. 확인할 곳은 첫 줄 따옴표 안의 첫 숫자와 javac 뒤의 첫 숫자, 이렇게 두 군데입니다. 이 숫자를 기능 버전(feature version)이라고 하며, 둘 다 25여야 합니다. 둘째·셋째 줄의 문구는 배포판마다 다르고, Oracle JDK처럼 첫 줄이 java version으로 시작하는 배포판도 있습니다.
두 명령을 모두 확인하는 데는 이유가 있습니다. java가 동작한다고 해서 javac도 있다는 뜻은 아니고, 둘 다 있더라도 서로 다른 JDK에서 왔을 수 있기 때문입니다. 예를 들어 예전에 설치한 Java 21의 java와 새로 설치한 JDK 25의 javac가 함께 잡히면, 25로 컴파일한 프로그램을 21이 실행하지 못해 오류가 납니다. 이 오류의 모습은 세 번째 글에서 직접 확인합니다.
더 깊이: 버전 번호와 LTS
25.0.2 같은 버전 문자열은 앞에서부터 기능 버전, 중간(interim) 버전, 업데이트 버전으로 읽습니다. 이 규칙은 JDK 10부터 쓰이는 시간 기반 버전 체계(JEP 322)이며, 뒤쪽의 0은 생략합니다. 그래서 업데이트가 나오기 전의 첫 정식판은 25.0.0이 아니라 25로 표시되고, 이때는 java -version의 첫 줄에 "25", javac -version에 javac 25가 나옵니다. 기능 버전은 6개월마다 1씩 오르며, 새 언어 기능과 API는 이때만 들어옵니다. 업데이트 버전은 같은 기능 버전 안에서 보안 패치와 버그 수정이 나올 때마다 오릅니다. 그래서 25.0.1과 25.0.5는 언어와 표준 API가 같고, 이 교재가 기능 버전만 맞추라고 하는 이유도 여기에 있습니다.
LTS는 Java 언어 규격이 정한 개념이 아니라 배포판을 만드는 쪽의 지원 정책입니다. Oracle을 비롯한 주요 배포판은 2021년의 17 이후 2년마다 나오는 기능 버전, 즉 17, 21, 25를 LTS로 지원하고 있습니다. LTS가 아닌 버전은 대개 다음 기능 버전이 나오면 업데이트가 끝납니다. 그래서 오래 유지할 프로그램이나 이 교재처럼 기준을 고정해야 하는 경우에는 LTS를 고릅니다.
터미널은 명령을 어디서 찾을까
명령 하나가 동작하지 않으면 터미널은 그런 명령을 찾을 수 없다고 알려 줍니다. PowerShell은 'java' 용어가 인식되지 않는다는 빨간 오류를 보여 주고, Linux의 bash는 java: command not found나 Command 'java' not found 같은 메시지를 출력합니다. macOS에는 앞에서 말한 /usr/bin/java가 늘 있으므로, JDK가 없으면 대신 Java 런타임을 찾을 수 없다는 메시지가 나옵니다. 어느 쪽이든 Java 코드의 문제가 아니라, 터미널이 실행할 JDK의 파일을 찾지 못했다는 뜻입니다.
터미널은 명령 이름을 받으면 PATH라는 환경 변수에 적힌 폴더들을 앞에서부터 차례로 살펴보다가, 그 이름의 실행 파일을 처음 발견한 곳에서 멈춥니다. 그래서 JDK를 설치했더라도 그 JDK의 bin 폴더가 PATH에 없으면 명령을 찾지 못합니다. 반대로 여러 JDK의 bin 폴더가 PATH에 들어 있으면 앞쪽에 있는 JDK가 선택됩니다. 지금 PATH에 어떤 폴더가 들어 있는지는 다음 명령으로 볼 수 있습니다.
$env:Path -split ';'echo "$PATH" | tr ':' '\n'첫 명령은 Windows PowerShell용이고 둘째는 macOS·Linux용입니다. Windows는 PATH의 폴더를 세미콜론(;)으로, macOS와 Linux는 콜론(:)으로 구분하기 때문에 명령이 조금 다릅니다. 두 명령 모두 폴더를 한 줄에 하나씩, 터미널이 살펴보는 순서대로 보여 줍니다.
PATH 전체를 읽는 것보다 java와 javac가 실제로 어느 파일로 연결되는지 바로 확인하는 편이 빠릅니다. Windows PowerShell에서는 다음 명령을 씁니다.
Get-Command java, javac | Select-Object Name, Source
where.exe java
where.exe javacGet-Command는 지금 입력하면 실제로 실행될 파일을 찾아 주고, Source 열에 그 파일의 전체 경로를 보여 줍니다. where.exe는 PATH에서 찾을 수 있는 같은 이름의 파일을 살펴보는 순서대로 모두 나열하므로, 여러 줄이 나오면 첫 줄이 지금 선택된 파일입니다. PowerShell에서 where만 입력하면 Where-Object라는 다른 명령의 줄임말로 처리되기 때문에 .exe까지 붙여야 합니다. macOS와 Linux에서는 다음 명령을 씁니다.
command -v java
command -v javacLinux에서는 결과가 보통 /usr/bin/java처럼 나옵니다. 이 파일은 실제 JDK 안의 파일을 가리키는 바로 가기(심볼릭 링크)이므로, 어느 JDK인지 알고 싶다면 readlink -f "$(command -v java)"로 끝까지 따라가 봅니다. macOS에서도 /usr/bin/java가 나오지만, 앞에서 설명한 연결 프로그램이라서 이 경로만으로는 어떤 JDK가 쓰이는지 알 수 없습니다. 그래서 macOS에서는 java -version의 출력과 /usr/libexec/java_home -V의 목록을 함께 봅니다.
지금까지의 확인 과정을 한 흐름으로 정리하면 아래와 같습니다. 두 명령을 모두 찾았는지 먼저 보고, 다음으로 둘 다 기능 버전 25인지를 봅니다. 어느 단계에서 막혔는지에 따라 고칠 곳이 달라집니다.
설치 뒤 java와 javac를 함께 확인한다
설치·새 터미널·두 명령 탐색·버전 판정과 각각의 실패 분기가 실제 준비 절차입니다. 본문의 PATH 선택 확인을 같은 판정 영역에서 순서대로 따라가며 판정 과정을 확인할 수 있습니다.
FLOWCHART · COMMAND RESOLUTION
설치보다 중요한 두 명령의 선택과 검증
설치 파일이 있다는 사실만으로는 충분하지 않다. 새 터미널이 java와 javac를 모두 찾고, 두 명령이 기능 버전 25를 보고해야 준비가 끝난다.
- JDK 25와 PATH 연결
Java 25 JDK 하나를 설치하고 그 JDK의
bin폴더를PATH에 연결합니다.JAVA_HOME은 도구가 참고할 수 있는 별도 포인터입니다. - 새 터미널 열기
이미 열려 있던 터미널은 이전 환경을 유지할 수 있으므로 닫고 새로 엽니다.
- 두 명령의 실제 위치 확인
Get-Command java, javac로 선택된 파일을 보고where.exe로 다른 후보와 PATH 순서를 확인합니다. - 서로 다른 역할 검증
java는 JVM을 시작하는 launcher이고javac는 소스를 class로 바꾸는 compiler입니다. 둘 다 발견되어야 합니다. - 기능 버전 판정
java -version과javac -version이 모두 기능 버전 25를 보고하면 준비 완료입니다. 누락되면 설치·PATH를, 다르면 PATH 순서를 고칩니다.
JAVA_HOME 값만 바꿨다고 셸의 java 선택이 자동으로 바뀌는 것은 아니다.
이 예의 조건
- 설치 후 새 터미널에서 확인하는 절차이며 이 조사에서 설치/명령 실행을 수행한 결과가 아니다.
관계도의 보충 설명
| 구분 | 내용 |
|---|---|
| 전체 읽기 정보 | 설치 뒤 java와 javac를 함께 확인한다 JDK 25 명령 선택과 버전 판정 흐름 FLOWCHART · COMMAND RESOLUTION 설치보다 중요한 두 명령의 선택과 검증 설치 파일이 있다는 사실만으로는 충분하지 않다. 새 터미널이 java와 javac를 모두 찾고, 두 명령이 기능 버전 25를 보고해야 준비가 끝난다. JDK 25와 PATH 연결 Java 25 JDK 하나를 설치하고 그 JDK의 bin 폴더를 PATH 에 연결합니다. JAVA_HOME 은 도구가 참고할 수 있는 별도 포인터입니다. 새 터미널 열기 이미 열려 있던 터미널은 이전 환경을 유지할 수 있으므로 닫고 새로 엽니다. 두 명령의 실제 위치 확인 Get-Command java, javac 로 선택된 파일을 보고 where.exe 로 다른 후보와 PATH 순서를 확인합니다. 서로 다른 역할 검증 java 는 JVM을 시작하는 launcher이고 javac 는 소스를 class로 바꾸는 compiler입니다. 둘 다 발견되어야 합니다. 기능 버전 판정 java -version 과 javac -version 이 모두 기능 버전 25를 보고하면 준비 완료입니다. 누락되면 설치·PATH를, 다르면 PATH 순서를 고칩니다. JAVA_HOME 값만 바꿨다고 셸의 java 선택이 자동으로 바뀌는 것은 아니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 환경 읽기 JDK 설치와 PATH 연결 뒤 새 터미널을 엽니다. |
|
|
| 두 도구 탐색 java와 javac를 각각 찾고 기능 버전을 읽습니다. |
|
|
| 준비 판정 두 명령과 버전을 함께 판정합니다. |
|
|
설치 뒤 java와 javac를 함께 확인한다
설치·새 터미널·두 명령 탐색·버전 판정과 각각의 실패 분기가 실제 준비 절차입니다. 본문의 PATH 선택 확인을 같은 판정 영역에서 순서대로 따라가며 판정 과정을 확인할 수 있습니다.
FLOWCHART · COMMAND RESOLUTION
설치보다 중요한 두 명령의 선택과 검증
설치 파일이 있다는 사실만으로는 충분하지 않다. 새 터미널이 java와 javac를 모두 찾고, 두 명령이 기능 버전 25를 보고해야 준비가 끝난다.
- JDK 25와 PATH 연결
Java 25 JDK 하나를 설치하고 그 JDK의
bin폴더를PATH에 연결합니다.JAVA_HOME은 도구가 참고할 수 있는 별도 포인터입니다. - 새 터미널 열기
이미 열려 있던 터미널은 이전 환경을 유지할 수 있으므로 닫고 새로 엽니다.
- 두 명령의 실제 위치 확인
Get-Command java, javac로 선택된 파일을 보고where.exe로 다른 후보와 PATH 순서를 확인합니다. - 서로 다른 역할 검증
java는 JVM을 시작하는 launcher이고javac는 소스를 class로 바꾸는 compiler입니다. 둘 다 발견되어야 합니다. - 기능 버전 판정
java -version과javac -version이 모두 기능 버전 25를 보고하면 준비 완료입니다. 누락되면 설치·PATH를, 다르면 PATH 순서를 고칩니다.
JAVA_HOME 값만 바꿨다고 셸의 java 선택이 자동으로 바뀌는 것은 아니다.
이 예의 조건
- 설치 후 새 터미널에서 확인하는 절차이며 이 조사에서 설치/명령 실행을 수행한 결과가 아니다.
관계도의 보충 설명
| 구분 | 내용 |
|---|---|
| 전체 읽기 정보 | 설치 뒤 java와 javac를 함께 확인한다 JDK 25 명령 선택과 버전 판정 흐름 FLOWCHART · COMMAND RESOLUTION 설치보다 중요한 두 명령의 선택과 검증 설치 파일이 있다는 사실만으로는 충분하지 않다. 새 터미널이 java와 javac를 모두 찾고, 두 명령이 기능 버전 25를 보고해야 준비가 끝난다. JDK 25와 PATH 연결 Java 25 JDK 하나를 설치하고 그 JDK의 bin 폴더를 PATH 에 연결합니다. JAVA_HOME 은 도구가 참고할 수 있는 별도 포인터입니다. 새 터미널 열기 이미 열려 있던 터미널은 이전 환경을 유지할 수 있으므로 닫고 새로 엽니다. 두 명령의 실제 위치 확인 Get-Command java, javac 로 선택된 파일을 보고 where.exe 로 다른 후보와 PATH 순서를 확인합니다. 서로 다른 역할 검증 java 는 JVM을 시작하는 launcher이고 javac 는 소스를 class로 바꾸는 compiler입니다. 둘 다 발견되어야 합니다. 기능 버전 판정 java -version 과 javac -version 이 모두 기능 버전 25를 보고하면 준비 완료입니다. 누락되면 설치·PATH를, 다르면 PATH 순서를 고칩니다. JAVA_HOME 값만 바꿨다고 셸의 java 선택이 자동으로 바뀌는 것은 아니다. |
| 관찰·상황 | 값·보충 정보 | 변화·이유 |
|---|---|---|
| 환경 읽기 JDK 설치와 PATH 연결 뒤 새 터미널을 엽니다. |
|
|
| 두 도구 탐색 java와 javac를 각각 찾고 기능 버전을 읽습니다. |
|
|
| 준비 판정 두 명령과 버전을 함께 판정합니다. |
|
|
명령을 찾지 못하거나 버전이 다를 때
문제가 생겨도 당황할 필요는 없습니다. 증상을 보면 원인이 대부분 좁혀지고, 고칠 곳은 설치한 패키지나 PATH 가운데 하나인 경우가 많습니다.
| 증상 | 먼저 확인할 것 | 흔한 원인 |
|---|---|---|
java와 javac를 둘 다 찾지 못함 | 설치를 마친 뒤 새 터미널을 열었는지 | 설치 전에 연 터미널을 그대로 씀, PATH에 JDK의 bin 폴더가 없음 |
java는 되는데 javac만 찾지 못함 | 설치한 패키지가 JDK인지 | 실행 전용 패키지인 JRE를 설치함 |
| 둘 중 하나가 25가 아님 | where.exe나 command -v가 보여 주는 경로 | 예전에 설치한 JDK가 PATH 앞쪽에 있음 |
| 터미널은 25인데 IDE는 다름 | IDE의 프로젝트 JDK 설정 | IDE는 터미널과 따로 JDK를 고름 |
JRE(Java Runtime Environment)는 이미 만든 프로그램을 실행하는 데 필요한 부분만 담은 패키지라서 컴파일러가 없습니다. 다운로드 페이지에서 패키지 종류를 JRE로 고르거나, Linux에서 이름에 jre가 들어간 패키지를 설치하면 이런 상태가 됩니다. 이때는 패키지 종류를 JDK로 바꿔 다시 설치합니다.
예전 JDK가 먼저 선택되는 경우에는 운영체제별로 고치는 방법이 다릅니다. Windows에서는 시작 메뉴에서 '시스템 환경 변수 편집'을 검색해 열고 [환경 변수] 버튼을 누릅니다. 창의 위쪽 사용자 변수와 아래쪽 시스템 변수에 각각 Path가 있으니, JDK 항목이 들어 있는 쪽의 Path를 골라 [편집]을 누릅니다. 목록에서 C:\Program Files\Eclipse Adoptium 아래 jdk-25로 시작하는 폴더의 bin 항목을 찾아 [위로 이동]으로 예전 JDK 항목보다 위에 두고, 더 쓰지 않는 예전 항목은 삭제해도 됩니다. where.exe java의 첫 줄이 ...\Oracle\Java\javapath\java.exe처럼 예전에 설치한 Oracle Java의 폴더를 가리키는 경우가 흔하니 이 항목의 위치도 확인합니다.
macOS에서 JDK 25보다 높은 버전을 함께 설치했다면 /usr/bin/java는 더 높은 버전을 고릅니다. macOS의 연결 프로그램은 JAVA_HOME 환경 변수가 있으면 그 값이 가리키는 JDK를 실행하므로, 다음 명령으로 셸 설정 파일 ~/.zshrc에 JAVA_HOME을 추가하고 새 터미널을 열면 25가 선택됩니다.
echo 'export JAVA_HOME=$(/usr/libexec/java_home -v 25)' >> ~/.zshrcUbuntu나 Debian에서 JDK가 여러 개 설치돼 있다면 sudo update-alternatives --config java를 실행해 목록에서 25를 고릅니다. 그 뒤에도 javac -version이 다르게 나오면 sudo update-alternatives --config javac로 같은 일을 한 번 더 합니다. 어느 운영체제든 설정을 바꾼 뒤에는 새 터미널을 열어 java -version과 javac -version을 다시 확인합니다. 여러 곳을 한꺼번에 바꾸기보다 하나를 고칠 때마다 두 버전을 확인하는 편이 원인을 찾기 쉽습니다.
여기서 JAVA_HOME과 PATH의 차이를 짚고 넘어가겠습니다. PATH는 터미널이 명령을 찾을 폴더 목록이고, JAVA_HOME은 JDK가 설치된 폴더 하나를 가리키는 별도의 환경 변수입니다. 터미널은 java를 찾을 때 PATH만 보고 JAVA_HOME은 보지 않습니다. JAVA_HOME은 IDE나 빌드 도구 같은 다른 프로그램이 JDK 위치를 알아낼 때 읽는 값입니다.
그래서 JAVA_HOME만 바꾸고 PATH를 그대로 두면 보통 터미널의 java는 바뀌지 않습니다. 예외는 두 가지입니다. 하나는 PATH에 %JAVA_HOME%\bin처럼 JAVA_HOME을 참조하는 항목을 넣어 둔 경우이고, 다른 하나는 앞에서 본 macOS의 연결 프로그램입니다.
더 깊이: Windows의 사용자 Path와 시스템 Path
Windows의 환경 변수 창을 보면 Path가 위쪽 사용자 변수와 아래쪽 시스템 변수에 각각 있습니다. 프로그램이 시작될 때 실제로 쓰이는 PATH는 시스템 Path 뒤에 사용자 Path를 이어 붙인 것입니다. 그래서 시스템 Path에 예전 JDK가 있으면, 사용자 Path의 맨 위에 JDK 25를 두어도 예전 JDK가 먼저 선택됩니다. where.exe java의 순서가 예상과 다르다면 두 목록을 모두 확인하세요.
실습 폴더 만들기
이제 예제 파일을 모아 둘 작업 폴더를 만듭니다. 새 터미널은 보통 사용자 폴더에서 시작하는데, Windows라면 C:\Users\사용자이름, macOS라면 /Users/사용자이름, Linux라면 /home/사용자이름입니다. PowerShell을 관리자 권한으로 열면 C:\Windows\System32에서 시작하므로 일반 권한으로 엽니다. 아래 명령은 사용자 폴더 안에 java-board 폴더와 그 하위 폴더 src, out을 만들고 java-board 안으로 들어갑니다. Windows PowerShell에서는 다음 명령을 차례로 실행합니다.
New-Item -ItemType Directory -Force java-board/src | Out-Null
New-Item -ItemType Directory -Force java-board/out | Out-Null
Set-Location java-board
Get-Location
Get-ChildItem -NameNew-Item -ItemType Directory는 폴더를 만들고, -Force는 폴더가 이미 있어도 오류 없이 넘어가게 합니다. 뒤에 붙은 | Out-Null은 만든 폴더의 정보를 화면에 출력하지 않게 하는 부분입니다. Set-Location은 현재 폴더를 옮기고, Get-Location은 현재 폴더를 출력하며, Get-ChildItem -Name은 현재 폴더 안에 있는 항목의 이름을 나열합니다. 마지막 명령이 out과 src를 한 줄씩 출력하면 성공입니다. macOS와 Linux에서는 같은 일을 다음 명령으로 합니다.
mkdir -p java-board/src java-board/out
cd java-board
pwd
lsmkdir -p는 중간 폴더까지 한꺼번에 만들고, 이미 있는 폴더는 그대로 둡니다. cd는 현재 폴더를 옮기고 pwd는 현재 폴더의 전체 경로를 출력합니다. ls가 out과 src를 보여 주면 성공입니다. 두 방법 모두 결과는 다음과 같은 구조입니다.
java-board/
├─ src/ # 직접 작성하는 .java 파일
└─ out/ # javac가 만드는 .class 파일두 폴더를 나누는 이유는 담기는 파일의 성격이 다르기 때문입니다. src에는 사람이 직접 쓰고 고치는 원본이 들어가므로 잃어버리면 안 됩니다. 반면 out에는 javac가 src의 원본으로부터 만들어 내는 결과물이 들어가므로, 지워도 컴파일만 다시 하면 똑같이 만들 수 있습니다. 둘을 한 폴더에 섞어 두면 어떤 파일을 지워도 되는지 헷갈리기 쉽습니다.
ARCHITECTURE · WORKSPACE OWNERSHIP
사람이 보존하는 src와 도구가 다시 만드는 out
현재 작업 디렉터리가 상대 경로의 기준이 된다. 편집기는 src에 원본을 남기고, JDK 도구는 그 원본에서 out의 JVM bytecode를 다시 만든다.
- 현재 위치가 경로의 기준
Get-Location이java-board를 가리킬 때src/...와out/...상대 경로가 의도한 파일을 찾습니다. - 편집기는 src에 씀
src/*.java는 사람이 수정하고 보존하는 원본입니다. - 터미널은 JDK 도구를 호출
작업 폴더에서
javac와java명령을 실행하되, 터미널 자체가 소스나 class를 만들지는 않습니다. - javac는 out을 갱신
javac가src의 Java 소스를 읽어out에 JVM bytecode인.class를 만듭니다. - java와 JVM은 class를 읽음
javalauncher가 JVM을 시작해out의 class를 실행합니다.out은 소스와 같은 컴파일 명령으로 다시 만들 수 있습니다.
src는 정답 원본이고 out은 그 원본에서 다시 계산할 수 있는 시점별 산출물이다.
앞으로 명령에 나오는 src/Hello.java 같은 경로는 모두 java-board 폴더에서 출발하는 상대 경로입니다. 터미널이 다른 폴더에 있으면 같은 명령을 입력해도 엉뚱한 위치에서 파일을 찾으므로, 별도 안내가 없으면 항상 java-board 안에서 명령을 실행합니다. 터미널을 새로 열면 다시 사용자 폴더에서 시작하니 먼저 cd java-board로 들어와야 합니다. cd는 PowerShell에서도 Set-Location의 다른 이름으로 동작하므로 세 운영체제에서 똑같이 쓸 수 있습니다. 명령이 파일을 찾지 못한다는 오류가 나면 가장 먼저 Get-Location이나 pwd로 현재 폴더를 확인하세요.
정리
- JDK는 컴파일러
javac, 실행기java, 표준 라이브러리를 묶은 개발 도구입니다. 이 교재는 2025년 9월에 나온 LTS 버전인 JDK 25를 기준으로 합니다. - 설치한 뒤에는 새 터미널을 열고
java -version과javac -version이 모두 기능 버전 25를 출력하는지 확인합니다. - 터미널은 PATH의 폴더를 앞에서부터 살펴보며 명령을 찾습니다. 명령을 못 찾거나 버전이 다르면
where.exe나command -v로 실제 선택된 파일부터 확인합니다. - JAVA_HOME은 다른 도구가 JDK 위치를 알아낼 때 읽는 값이며, 터미널이 명령을 찾는 데는 쓰이지 않습니다.
- 예제는
java-board폴더에서 실행합니다.src에는 직접 쓰는 원본을,out에는 다시 만들 수 있는 컴파일 결과를 둡니다.
연습 문제
- 새 터미널에서
java -version,javac -version,Get-Command java(macOS·Linux는command -v java),Get-Location(macOS·Linux는pwd)을 차례로 실행하고 결과를 적어 보세요. - JDK 25를 설치한 직후, 설치 전부터 열려 있던 PowerShell 창에서
javac -version을 실행했더니 명령을 찾을 수 없다는 오류가 났습니다. 원인과 해결 방법을 설명하세요. java -version은 기능 버전 21을,javac -version은 25를 출력합니다. 무엇을 확인하고 어떻게 고쳐야 할까요?- Windows를 쓰는 친구가 "JAVA_HOME을 JDK 25 폴더로 바꿨는데 터미널의 java는 여전히 21이에요"라고 합니다. 이유를 설명하세요.
힌트
- 두 기능 버전이 같은지, 현재 폴더가 어디인지가 핵심입니다.
- 터미널은 환경 변수를 언제 읽나요?
- 두 명령이 각각 어느 폴더의 파일로 실행되는지 보세요.
- 터미널이
java를 찾을 때 보는 환경 변수는 무엇인가요?
해설
java -version첫 줄의 따옴표 안 첫 숫자와javac -version의 첫 숫자가 둘 다 25이고,Get-Command java나command -v java가 JDK 25의 파일(macOS와 Linux에서는 보통/usr/bin/java가 나오며, Linux라면readlink -f "$(command -v java)"로 따라간 경로가 JDK 25 폴더 안이어야 합니다)을 가리키며, 현재 폴더가java-board로 끝나면 첫 프로그램을 만들 준비가 끝난 것입니다. 하나라도 다르면 앞의 표에서 해당 증상을 찾아 고친 뒤 새 터미널에서 다시 확인합니다.- 설치 프로그램은 PATH를 바꿨지만, 이미 열려 있던 창은 시작할 때 복사해 둔 예전 PATH를 계속 씁니다. 그래서 그 창의 PATH에는 새 JDK의
bin폴더가 없습니다. 창을 닫고 새로 연 뒤 다시 확인하면 됩니다. 새 창에서도 찾지 못한다면 설치할 때 PATH 항목이 켜져 있었는지, JDK가 아니라 JRE를 설치하지 않았는지 확인합니다. - 두 명령이 서로 다른 JDK에서 오고 있습니다. Windows에서는
where.exe java와where.exe javac로, Linux에서는readlink -f "$(command -v java)"와readlink -f "$(command -v javac)"로 실제 경로를 확인하면java는 예전 Java 21 폴더에서,javac는 JDK 25 폴더에서 찾았을 것입니다. Windows라면 Path에서 JDK 25의bin을 예전 항목보다 위로 올리고, Ubuntu라면update-alternatives로java를 25로 고른 뒤 새 터미널에서 두 버전을 다시 확인합니다. 그대로 두면javac25로 만든 클래스를java21이 실행하지 못합니다. - 터미널은 명령을 찾을 때 PATH만 봅니다. JAVA_HOME을 바꿔도 PATH에 Java 21의
bin폴더나 Oracle의javapath폴더가 직접 적혀 있으면 그java가 계속 선택됩니다.where.exe java로 어느 폴더의 파일이 선택되는지 확인한 뒤, PATH에서 그 항목을 지우거나 JDK 25의bin을 그보다 위로 올립니다. PATH가%JAVA_HOME%\bin을 참조하도록 설정된 경우에만 JAVA_HOME을 바꾼 효과가 나타나며, 이때도 새 터미널을 열어야 반영됩니다.
다음 글
다음 글에서는 java-board/src에 다섯 줄짜리 소스 파일을 저장하고, 이 글에서 확인한 두 명령으로 컴파일하고 실행합니다.