세 용어는 자주 쓰이지만 그만큼 명확히 이해하지 못한 개념에 대해서 정리해놓으려 합니다.
워밍업
자바로 프로그래밍을 하려면 먼저 JDK를 설치해야합니다.
JDK를 설치하면, 자바가상머신(JVM)과 자바 클래스 라이브러리(JRE)+ 자바를 개발하는데 필요한 실행파일들(JDK)이 설치됩니다.
쉽게 말해,
- JDK : JRE + 개발에 필요한 실행파일(javac.exe 등)
- JRE : JVM + 클래스 라이브러리 + 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일
- JVM : 자바 가상 머신
bin 디렉터리의 주요 파일
1) javac.exe : 자바 컴파일러.자바 소스코드를 바이트 코드로 컴파일 합니다.
명령어 : (경로)\javac Hello.java
2) java.exe : 자바 인터프리터. 컴파일러가 생성한 바이트 코드를 해석하고 실행합니다.
명령어 : (경로)\java Hello
3) javap.exe : 역어셈블러. 컴파일된 클래스 파일을 원래의 소스로 변환한다.
명령어 : (경로)\javap Hello > Hello.java
4) jar.exe : 압축 프로그램. 클래스파일과 프로그램과 프로그램의 실행에 관련된 파일을 하나의 jar 파일로 압축하거나 압축해제합니다.
JVM - JRE - JDK 순으로 알아보겠습니다.
JVM
- JVM은 Java Virtual Machine의 약자로,
자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT;Just In Time-컴파일러)하여 실행합니다. - 바이트 코드를 실행하는 표준이자 구현체(특정 밴더가 구현한 JVM)라고 할 수 있습니다.
- JVM 밴더 : Azul, 오라클, 아마존, ..
JVM이 왜 필요한가요?
컴파일된 0과 1의 조합은 운영체제(OS)마다 다르게 이해하는데,
C언어의 경우, C언어 컴파일러로 컴파일된 코드(바이너리 코드)일지라도 각 운영체제, 예를 들면 Windows, Mac, Linux가 모두 이해할 수 있는 것이 아닙니다. 그렇기 때문에 C언어는 각각 운영체제마다 다른 컴파일이 필요합니다.
이와 달리 java는 자바 컴파일러가 1개 있고, 각각의 운영체제가 이해할 수 있도록 이를 다시 컴파일하는 JVM이 있습니다.
즉, 자바 컴파일러가 컴파일한 바이트 코드를 각 운영체제의 JVM에게 전달되어 JVM이 각각의 운영체제가 이해할 수 있도록 다시 한번 컴파일 하는 것입니다.
이는 바이트 코드와 운영체제 사이를 호환시켜주는 역할을 하는 것이지요.
+ 이것은 운영체제에 독립적으로 실행할 수 있다는 자바의 장점일 수 있지만, 한편으로 실행 속도가 상대적으로 느려지는 단점이 됩니다.
바이트코드와 바이너리 코드, 차이점이 뭘까요?
보통 C언어에서는 바이너리 코드, Java에서는 바이트 코드라 합니다.
- 바이너리 코드 : 컴퓨터가 인식하고 이해할 수 있는 0과 1로 구성된 코드이지만, 환경에 종속적이며 실행하지 못합니다. '링커'에 의해 메모리 주소값을 반영하고 CPU가 직접 해독하고 실행할 수 있도록 수정되어야 기계어가 되는 것이기 때문에 가장 기계어와 유사한 레벨의 코드지만 완전한 기계어는 아닙니다.
- 바이트 코드 : 가상머신(JVM, CLR 등)에서 사용되는 코드 개념으로, 가상머신이 이해할 수 있는 중간 레벨로 컴파일 한 것을 말합니다. 이는 어셈블리어와 유사한 형태를 띄고 있으며, 컴파일러(javac, csc.exe 등) 에 의해 변환됩니다. (<- JVM, CLR에서 컴파일러가 하는 역할)
바이너리 코드와 달리 어떠한 환경에 종속적이지 않고 실행될 수 있는 가상 머신용 기계어 코드입니다.
++) 이 바이트 코드는 VM에 의해 다시 인터프리터 방식을 통해 기계어(네이티브 코드)로 해석된다고 앞서 말했지요? - 기계어 : 프로그램을 나타내는 가장 낮은 단계의 개념으로, CPU가 직접 해독하고 실행할 수 있는 비트 단위로 쓰였습니다.
- 최소 배포 단위는 JDK이기 때문에 포함되어 함께 설치됩니다.
- 최초의 JVM은 자바를 위해 만들어졌지만, 중간에 클래스 파일만 있는 모든 것을 실행할 수 있기 때문에
자바가 아닌 다른 언어도 클래스 파일만 있다면 JVM을 사용할 수 있습니다. 현재는 Java 외 다른 언어(클로저, 그루비, 코틀린 등)에서도 사용하고 있습니다.
JRE
Java Runtime Environment(자바 실행 환경)의 약자로 JVM의 실행환경을 구현하는 역할을 합니다.
즉, 자바 애플리케이션을 실행할 수 있도록 구성된 배포판입니다.
- JRE는 JVM(자바 가상머신)과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일(jar 파일)을 가지고 있습니다.
- JRE 역시 JDK를 설치하면 함께 설치됩니다. 기존에는 개별적으로 설치가 가능했지만 JDK11 버전부터는 따로 제공되지 않습니다.
JDK
Java Development Kit(자바 개발 도구)의 약자로 컴파일러, 디버그 도구 등 개발에 필요할 도구를 제공합니다.
- JRE에 java는 설치되어있지만 java 컴파일러(javac)는 포함되어있지 않습니다. 이러한 개발툴까지 함께 제공하는 것이 JDK입니다. 즉 JRE + 개발에 필요할 툴을 제공합니다.
- 앞서 JVM이 컴파일한 결과물을 OS에 맞게 재 컴파일한다고 언급했는데, 그 결과물은 JDK가 컴파일을 한 것입니다.
- JDK의 종류 : Oracle JDK, Azul, OpenJDK, Red Hat/CentOS, 등등..
사람들이 JAVA라고 하고 JAVA 11이라 하는것은 결국 JDK의 버전을 의미합니다.
Java를 설치한다? == JDK를 설치한다 라고 할 수 있겠지요.
참고
(Amazon, 등등..에서 만든) OpenJDK는 무료이고, Oracle에서 만든 OpenJDK도 무료이지만 Oracle에서 만든 OraclJDK는 개인에게는 무료지만 기업에게는 유료입니다. (상용으로 사용할 때 유료)
JAVA
JAVA는 프로그래밍 언어입니다.
JDK에 들어있는 자바 컴파일러(javac)를 사용해서 바이트코드(.class 파일)로 컴파일할 수 있습니다.
개인적인 느낀점
위 정리는 해당 영상을 보면서 아 내가 JDK, JVM, JRE에 대해 잘 모르고 있었구나를 느끼며 정리하기 시작한 글이다.
특히 너무 길어져 다른 글로 작성한 JVM 게시글을 정리하면서
JVM의 구조, 동작 원리를 잘 모르고 있었으니 당연히 서버가 작동하면서 어떻게 진행되는지 내 입으로 설명하기 어려웠을 수 밖에 없다는 것을 느꼈다.
그래서 해당 영상과 백기선님의 강좌를 통해 배우고 정리하면서 JVM에 대해서 더 자세히 이해할 수 있었다.
요즘 JVM의 구조, 스프링의 라이프사이클 등 동작하는 방식과 원리에 대해 이해하면서 더 재미있게 공부하고 있다. 자세히 알지못하고 지나칠 수 있으면서도 사실은 중요한 내용을 알고나니 자바와 스프링에 더 재미를 붙이게 되는 것 같다.
출처
- https://devbox.tistory.com/entry/%EC%8B%A4%ED%96%89
- 더 자바, “코드를 조작하는 다양한 방법"
- https://www.youtube.com/watch?v=f0cAmTYo4tQ&t=565s
피드백은 환영입니다.
수정과 추가가 필요한 부분은 꾸준히 업데이트할 예정입니다.
'언어 > Java' 카테고리의 다른 글
JVM(Java Virtual Machine)의 구조 - 메모리 (0) | 2022.03.02 |
---|---|
Stack과 Heap.. 그리고 Garbage Collection (0) | 2022.02.26 |
Exception과 Exception handler (+테스트 코드) (0) | 2022.01.05 |
참조 타입과 메모리 사용 영역 (+Java 코드 실행 과정) (0) | 2021.12.29 |
[짧은글] 컬렉션 프레임워크 (Collections Framework) (0) | 2021.10.04 |