가장 기본이자, 확실히 알아두면 좋은
자바 , JVM , JDK , JRE 의 개념에 대해 알아보는 시간을 가지겠다.
개념을 모호하게 알거나, 그냥 자바라고 통칭해서 표현하는 경우가 많은데
뜻을 정확히 알고 정확한 용어를 사용할 수 있도록 해보자.

자바 가상 머신 (JVM) 은 자바 바이트 코드 (.class 파일 ) 를 OS 에 특화된 코드로 변환하여 실행하는 역할을 담당한다.
따라서 JVM 은 바이트 코드를 실행하는 표준으로 볼 수도 있고,
특정 벤더가 구현한 구현체로 볼 수도 있다.
JVM 스팩은 여기 에 기술되어 있다.
OS에 특화된 코드로 변환해주기 때문에 당연하게 특정 플랫폼에 종속적이다.
JRE 는 JVM 과 라이브러리를 포함하는 개념이다.
자바 애플리케이션을 실행할 수 있도록 구성된 배포판으로,
JVM 과 핵심 라이브러리 (java.lang , java.util 라이브러리 등) 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일 (java.policy , cacerts 등)을 가지고 있다.
개발 관련 도구는 포함하지 않는다. 그래서 개발은 못하고 실행만 가능하다.
그런데 왜 핵심 라이브러리가 JRE 에 포함이 되는걸까?
개발툴에 포함되어야 하는 거 아닐까?
-> 바이트코드(.class 파일)가 실행될 때에도 필요하기 때문이다.
System.out.println("Hello") 에 System, String 등은 전부 라이브러리 클래스이다. JVM 이 .class 파일을 실행하려면 이 클래스들을 찾을 수 있어야 하고, 없다면 실행할 때 에러가 나게 된다.
참고로 외부 라이브러리들은 JDK/JRE 에 포함되는 개념이 아니며,
classpath 에 명시적으로 포함을 시켜줘야 JVM 이 찾을 수 있다.
classpath 에 걸지 않는다면 ClassNotFoundException 이 발생하게 된다.
JDK 는 JRE 와 개발에 필요할 툴을 포함하는 개념이다.
오라클은 자바 11부터는 JDK 만 제공하고, JRE 를 따로 제공하지 않는다.
그래서 요즘은 JDK 와 JRE 를 크게 구분 짓지 않기도 하는 것 같다.
아무튼 개발하다 보면 인텔리제이에서 JDK 몇 버전을 쓸 지 흔하게 설정하는데,
그 JDK 가 이 JDK 를 말하는 것이다.
그리고 oracle jdk는 11 버전부터 사용으로 사용할 때 유료이다.
이 때문에 Java 가 유료화 되고 있다고 하는 말도 들리는데,
Java 는 계속 무료이고 oracle jdk 11 버전 이후부터 유료라고 표현하는 것이 정확하다.
정리하자면 우리가 자바로 개발을 하면,
개발 툴에 속하는 자바 컴파일러 (javac)가 이를 .class 파일로 만들어주고,
이 .class 파일을 JVM 이 OS 에 특화된 코드로 변환해 실제로 실행을 시키는 것이다.
이런 과정 때문에 Java 는 OS 에 종속적이지 않게 된다.
다만 JVM 은 OS 에 종속적이다.
가장 기초적인 개념이지만, 개발을 하다보면 기초의 중요성을 계속 깨닫게 된다.
누군가에게 도움이 되었으면 좋겠다. 읽어주셔서 감사합니다.
참조 : 더 자바, 코드를 조작하는 다양한 방법 - 백기선