JVM은 Java Virtual Machine 을 줄인 것으로, 직역하면 '자바를 실행하기 위한 가상 기계' 라고 할 수 있습니다.
다시 말하자면, '자바를 실행하기 위한 가상 컴퓨터' 라고 이해하면 좋을 것 같습니다.
자바로 작성된 애플리케이션은 모두 이 가상 컴퓨터(JVM)에서만 실행되기 때문에, 자바 애플리케이션이 실행되기 위해서는 반드시 JVM이 필요합니다.
자바 코드를 컴파일하여 .class 바이트 코드로 만들면 이 코드가 자바 가상 머신 환경에서 실행됩니다.
JVM은 자바 실행 환경 JRE(Java Runtime Environment)에 포함되어 있습니다.
현재 사용하는 컴퓨터의 운영체제에 맞는 자바 실행환경 (JRE)가 설치되어 있다면 자바 가상 머신이 설치되어 있다는 뜻입니다.
JVM이 필요한 이유에 앞서, 자바의 중요한 장점 중 하나는 다음과 같습니다.
"Write once, run anywhere." (한 번 작성하면 어디서든 실행된다.)
즉, "Java는 어떠한 플랫폼에 영향을 받지 않는다." 라는 장점을 가지는데, 이를 가능케 하는 것이 JVM 입니다. JVM을 사용하면 하나의 바이트 코드(.class)로 모든 플랫폼에서 동작하도록 할 수 있습니다.
.class 파일은 바이트 코드라고 하는데 사람이 쓰는 자바 코드에서
컴퓨터가 읽는 기계어로의 중간 단계라고 생각하시면 됩니다.
일반 애플리케이션의 코드는 OS만 거치고 하드웨어로 전달되는데 비해 Java 애플리케이션은 JVM을 한 번 더 거치기 때문에, 그리고 하드웨어 맞게 완전히 컴파일된 상태가 아니고 실행 시에 해석(interpret)되기 때문에 속도가 느리다는 단점을 가지고 있습니다.
그러나 요즘엔 바이트코드를 하드웨어의 기계어로 바로 변환해주는 JIT컴파일러와 향상된 최적화 기술이 적용되어서 속도의 격차를 많이 줄이게 되었습니다.
일반 애플리케이션은 OS와 바로 맞붙어 있기 때문에 OS 종속적 입니다. 그래서 다른 OS에서 실행시키기 위해서는 애플리케이션을 그 OS에 맞게 변경해야 합니다.
반면에, Java 애플리케이션은 JVM하고만 상호작용을 하기 때문에 OS와 하드웨어 독립적이라 다른 OS에서도 프로그램의 변경없이 실행이 가능합니다.
단, JVM은 OS에 종속적이기 때문에 해당 OS에서 실행가능한 JVM이 필요합니다.
JRE는 자바 실행 환경(Java Runtime Environment)의 약자로 자바로 만들어진 프로그램을 실행시키는데 필요한 라이브러리들과 각종 API, 그리고 자바 가상 머신 (JVM)이 포함되어 있습니다.
JRE는 자바로 "개발(쓰기)은 안되고 실행(읽기)만 된다"라고 생각하면 될 것 같습니다.
JDK는 자바 개발키트(Java Development Kit)의 약자로 이름 그대로 개발자들이 자바로 개발하는 데 사용됩니다.
JDK안에는 개발 시 필요한 라이브러리들과 javac(자바 컴파일러), javadoc 등의 개발 도구들을 포함되어 있고 개발을 하려면 당연히 실행도 시켜줘야 하기 때문에 JRE (Java Runtime Environment)도 함께 포함되어 있습니다.
즉, JDK는 프로그램을 생성, 실행, 컴파일 할 수 있습니다.
정리하자면 Java로 프로그램을 직접 개발하려면 JDK가 필요하고 Java로 만들어진 프로그램을 실행시키려면 JRE가 필요합니다.