[CS] JVM이란 무엇일까??

Pudrioid·2024년 2월 28일



Intro.

대학교 자바 전공수업에서 자주 언급되던 그 녀석,
Android 공부에서 가끔 튀어나오는 그 녀석,

JVM (Java Virtual Machine)

평소 JVM이란 "Java 코드 사용 시 어떻게 어떻게 도와주는 녀석"으로 알고 있었으나,
개발자의 근본 언어가 JAVA라고 여겨지는 만큼 좀 더 구체적으로 알 필요가 있다고 생각한다.

따라서 이번 기회에 JVM을 조금 깊게 정리해 보려 한다.







JVM

Java Virtual Machine


JVM이란,

Java Virtual Machine 즉, 자바 가상 머신 이라는 뜻인데,, 이게 대체 어떤 녀석일까?



우리가 이클립스 등의 JAVA 프래임워크를 사용하여 코드를 작성했다고 가정해 보자.

System.out.println("hello world");

그리고 실행해서 결과를 보려 하는데,

컴퓨터는 저 코드를 바로 이해할 수 있을까?



아니다!

현재 JAVA를 포함한 우리가 쓰고 있는 대부분의 언어는
컴퓨터를 위한 언어가 아닌 사람을 위한 언어이다.

따라서 컴퓨터는 내가 열심히 짠 언어코드를 바로 이해할 수 없다.
(자기가 쓰는 언어가 아니니까!)



내가 작성한 언어를 컴퓨터가 알아듣게 하기 위해서
번역 작업이 필요하다.

조금 더 자세히 말하면,

사람이 이해하는(고급언어) 언어를 기계어(저급언어)인 0과 1로된 코드로 바꾸는 작업이 필요하다.
(컴퓨터는 0과 1만 알아먹을 수 있기 때문에!!)



JAVA 컴파일 과정

저급언어로 바뀌려면 다음 과정을 거치게 된다.

  1. 내가 작성한 JAVA코드가 담긴 (파일이름).java 파일을 실행시킨다.
  1. 실행 시 JAVA 컴파일러를 통해 (파일이름).Java 파일이
    JAVA 바이트코드로 구성된 (파일이름).class 파일로 변환된다.
  1. JVM이 JAVA 바이트코드인 (파일이름).class 파일을 해석해 운영체제가 이해할 수 있는 기계어로 바꾼다.

차근 차근 짚고 넘어가보자.



1. 내가 작성한 JAVA코드가 담긴 (파일이름).java 파일을 실행시킨다.

코드를 다 짜고 실행 버튼을 눌렀을 때의 시점이라고 생각하면 될것 같다.



2. 실행 시, JAVA 컴파일러를 통해 (파일이름).Java 파일이 JAVA 바이트코드로 구성된 (파일이름).class 파일로 변환된다.

이때 컴파일과 관련 지식에 대해 짚고넘어갈 필요가 있는데,

컴파일 : 고급언어를 저급언어로 바꿔주는 행위, 언어마다 컴파일 방식이 다름!

컴파일러 : 런타임(프로그램 동작) 이전에 모든 코드를 컴파일하는 방식. 
(대표적으로 JAVA, C)

인터프리터 : 런타임 때 코드 한줄 컴파일 하고 실행, 한줄 컴파일 하고 실행~ 하는 방식.
(대표적으로 Python)

여기선 자바 컴파일러이기 때문에
고급언어와 저급언어의 중간쯤 되는 자바 바이트코드로 컴파일(번역)한다.



읽다 보면 이런 의문이 생길 수 있다.
아니 그냥 저급언어로 바꿔버리면 되지,, 굳이 중간쯤 되는 언어(?)로 바꾼다고..?

가장 큰 이유는 호환성.

운영체제(OS)의 종류는 여러가지가 있다.

유닉스, 윈도우, 리눅스, 안드로이드 등

중요한건,
운영체제마다 알아듣는 명령어가 다르기 때문에
윈도우에서 컴파일시킨 기계어를 당연히 윈도우는 이해해도
그것을 리눅스 등 다른 운영체제는 이해하지 못한다는 이야기다.

이로인해 운영체제마다 사용하는 컴파일러가 달라져야 하고
이것은 분명한 불편함이다.



이러한 호환성 문제를 JAVA의 JVM이 극복했다.
아래 그림처럼 운영체제 종류에 따른 JVM을 설치하면 어떤 운영체제든 JAVA코드를 이해할 수 있다.



3. JVM이 자바 바이트코드인 A.class 파일을 해석해 운영체제가 이해할 수 있는 기계어로 바꾼다.

JVM 내부에 있는 JIT(just in time) 컴파일러를 사용해 각 OS에 알맞은 기계어로 번역한다.





정리

JVM을 정리해 보면,
JAVA 컴파일러로 만들어진 JAVA 바이트코드를 기계어로 번역해 코드를 실행 시켜주는 녀석이고

JVM의 장점은 운영체제들의 호환성을 높여, JAVA 언어를 운영체제에 종속적이지 않은 언어로 만들어준다고 보면 될 것 같다.


JAVA 컴파일 과정

  1. 내가 작성한 JAVA코드가 담긴 (파일이름).java 파일을 실행시킨다.
  1. 실행 시 JAVA 컴파일러를 통해 (파일이름).Java 파일이
    JAVA 바이트코드로 구성된 (파일이름).class 파일로 변환된다.
  1. JVM이 JAVA 바이트코드인 (파일이름).class 파일을 해석해 운영체제가 이해할 수 있는 기계어로 바꾼다.


부족한 부분에 대한 피드백을 매우 환영합니다!

profile
안녕하세요 자라는 새싹 안드로이드 개발자입니다.

0개의 댓글