이번 포스팅은 왜 JVM이 필요한지에 대해 적을 예정이고 바이트 클래스가 무엇인지, 그리고 실행 과정은 어떤지에 대해 내용을 정리할 것이다.
많은 내용은 다음 블로그에서 보고 참고했다. 참고 블로그
JVM이 필요한 이유를 알기 위해서는 Java의 특징을 아는것도 중요하다. Java는 OS에 종속되지 않는 특징 이 있다. OS에 종속이 안되고 Java를 실행 시킬 수 있는 원리가 바로 JVM (Java를 실행할 수 있게 하는 가상 컴퓨터) 다.
OS에 종속 되지 않는다는 것이 어떤 의미인지 알아보자.
컴파일 언어
컴파일 언어란, 언어에 내장되어 있는 컴파일러가 각 기계가 이해하는 기계어로 변환 해주어서 실행 프로그램을 만들어 준다. 우리가 화면에서 보는 소스 코드는 사람이 이해하기 쉽게 만들어진 언어고, 실제로 코드가 실행 되려면 컴퓨터가 이해할 수 있는 기계어로 변환되는 것이 우선이다.
이렇게 컴파일된 코드를 Binary Code (기계가 읽을 수 있는 이진 코드, 기계어) 라고 부른다.
컴파일러가 만들어준 기계어에는 단점이 하나 있느데.. 특정 OS나 CPU 구조에 맞춰진 컴파일러에 의해 다르게 컴파일 되는 특징이 있다.
한마디로, 컴파일러가 변환해주는 기계어는 각 OS마다 다르게 해석된다.
이것은 각 OS 환경에 맞춰진 독자적인 컴파일러이기 때문이다. 그래서 C 언어의 경우, 윈도우용 C프로그램, 리눅스용 C프로그램 등 OS환경에 종속되었다고 한다.
Java의 등장
컴파일러는 운영체제에 종속적이고, 이 문제를 해결할 수 있게 JAVA (JVM) 이 등장하게 되었다.
JAVA언어로 작성된 소스코드의 경우, 직접 운영체제에서 실행되는 것이 아닌, JVM을 거쳐서 상호작용을 하게 된다.
한마디로, JVM만 있으면, 아까 예시로 말한 C언어와 반대로 OS에 종속된 것이 아닌, 운영체제로부터 독립적으로 프로그램 제약없이 실행할 수 있다
이것이 가능한 이뉴는 컴파일된 코드와, 하드웨어/OS 사이 중간에서, 해당 하드웨어/OS 환경에 맞게 JVM 이 Byte Code 로 변환해주기 때문이다.
결국, JVM 이 설치 되었다는 가정 하에, 같은 자바 프로그램은 어떤 운영체제에서도 같이 활용될 수 있다.
정리해보면, 아까 예시로 설명한 C언어의 경우, 컴파일 과정은
소스 코드 -> Binary Code (기계어) 변환 후 하드웨어에 읽어짐, OS 환경에 따라 코드가 달라져야함.
Java의 경우,
Java 언어는 OS에 종속된 환경이 아님으로, 이식성 이 높은 특성을 갖게 되었다.
JAVA 프로그램의 실행 과정
앞서 설명 했던 것처럼, JVM은 특성상 파일을 실행하기 위해서는 두번의 단계를 거쳐야 한다.
하나는 .java 파일을 .class 파일로 바꿔주는 컴파일 단계이고, 두번째는 .class 파일을 바이너리 코드로 변환하고 실행하는 단계이다.
다음 편에서는 JVM 의 메모리 구조에 대해 더 상세하게 적어보겠다.