프로그래밍 언어란
사람의 언어와 기계의 언어의
중간 다리 역할을 하는 언어를 말한다.
프로그래밍 언어로 작성된 내용을 소스(Source)라고 부르고
이 소스는 컴파일러(Compiler)라는 소프트웨어를 통해서
기계어로 변환된 후 컴퓨터에서 실행할 수 있게 된다.
운영체제(OS)에서는 자바 프로그램을 직접 실행할 수 없으며 JVM을 통해 자바 프로그램을 실행할 수 있다.
JVM이 설치된 환경에서 자바 프로그램을 실행하기 때문에 개발자는 운영체제와 상관없이 자바 프로그램을 개발할 수 있다.

JVM은 JDK(Java Development Kit) 또는 JRE(Java Runtime Environment)를 설치하면 자동으로 설치되는데 JDK와 JRE는 운영체제에 별로 제공되고 운영체제에 맞게 설치해야 한다.

JVM을 이해하려면 먼저 Java 실행 환경이 어떻게 결정되는지
특히 환경변수 PATH와 JAVA_HOME이 어떤 역할을 하는지를
정확히 짚고 넘어갈 필요가 있다.
Java는 단순히 설치만 되어 있다고 실행되는 게 아니라
운영체제가 어떤 java를 실행할지 선택하는 과정이 반드시 존재한다.
우선 CMD(명령 프롬프트)에서 중요한 점 하나가 있다.
CMD는 실행되는 시점의 환경변수 상태를 그대로 복사해서 사용한다.
즉, 환경변수를 수정한 뒤 이미 열려 있는 CMD에서는
그 변경 사항이 반영되지 않는다.
이 때문에 Java 버전을 바꿨는데도 java -version 결과가 그대로라면
대부분 CMD를 새로 열지 않은 경우다.
java, javac 같은 명령어는
사실 JDK 내부의 bin 디렉터리에 있는 실행 파일이다.
운영체제는 명령어를 실행할 때 다음과 같은 순서로 탐색한다.
PATH 환경변수에 등록된 경로를 위에서부터 순서대로이 말은 곧, PATH에 등록된 JDK bin 경로 중
가장 위에 있는 것이 실제로 사용된다는 뜻이다.
예를 들어 JDK 17과 JDK 21이 모두 설치되어 있고
PATH가 아래처럼 되어 있다면
C:\Program Files\Java\jdk-21\bin
C:\Program Files\Java\jdk-17\bin
java -version을 실행했을 때 JDK 21이 사용된다.
(순서를 바꾸면 결과도 바뀐다.)
그래서 다중 JDK 환경에서는 PATH 순서 관리가 핵심이다.
여기서 많은 사람들이 헷갈리는 부분이 바로 JAVA_HOME이다.
결론부터 말하면 JAVA_HOME은 PATH가 아니다.
JAVA_HOME은
“이 시스템에서 기준으로 사용하는 JDK가 어디에 설치되어 있는가”
를 나타내는 참조용 환경변수다.
값에는 반드시 bin 이전의 JDK 루트 경로가 들어간다.
예시
JAVA_HOME = C:\Program Files\Java\jdk-17
여기에 \bin을 붙이지 않는 이유는,
Maven, Gradle, IntelliJ, Spring Boot, Jenkins 같은 도구들이
%JAVA_HOME%\bin\java 형태로 내부적으로 사용하기 때문이다.
JAVA_HOME = C:\Program Files\Java\jdk-17
PATH에 %JAVA_HOME%\bin 추가
이렇게 설정해두면
JDK 버전을 바꾸고 싶을 때는 JAVA_HOME 값만 수정하면 되고
PATH는 건드릴 필요가 없다
결과적으로 유지보수가 훨씬 쉬워진다.
반대로 PATH에 JDK bin 경로를 직접 여러 개 박아두면
어느 JDK가 실제로 쓰이는지 헷갈리기 쉽고
버전 충돌의 원인이 된다.