Java

JVM에 대해서.Araboza (feat.JAVA의 동작과정)

개발기록 2024. 6. 21. 15:48

저번 포스팅에서 JAVA언어에 대해서 서술하고 특징에 대해서 알아보았다.

 

JAVA 언어의 특징중에 독립적인 플랫폼이라는 내용이 있었고, 해당 내용중에 JVM이라는 것에 대해 언급이 있었는데,  오늘은 이 JVM이라는 놈에 대해서 알아볼려고 한다.

 

1. JVM 왜 있는건데?


해당 JVM을 이해하기전에 때는 바야흐로 과거로 돌아가야 한다. JAVA라는 개발언어가 없고 C라는 개발 언어만 있을 당시 C언어의 개발 과정은 이러했다. 

 

C언어 개발 과정 (출처 : https://gamestory2.tistory.com/131)

 

위 그림과 같이 개발이 되다보니 OS에 대한 종속성이 부족하게 된것이다. OS의 종속성이 부족하게 될시 어떤한 문제가 발생하는가에 대해서는 아래와 같이 서술한다.

메이플스토리 설치시 권장사양

 

보시다시피 해당 게임의 소프트웨어 서비스를 이용하기 위해서는 운영체제가 즉 OS가 Windows 10 64비트 이상 이라는 종속성의 문제가 발생하게 된다. 그렇다면 나는 맥북이라는 노트북 사용자여서 OS가 MAC OS인데 메이플스토리라는 게임 서비스를 이용 못하는것인가? 이에 대한 답변은 그렇다 이다. 이와 같이 OS가 다르면 기껏 힘들게 개발한 프로그램 서비스를 제공을 못받게 되는것이다. 그럼 이에 대한 해결 방법은 MAC OS 혹은 다른 OS 별로 개발을 해야 해당 서비스를 이용 할수 있게 되는것이다. 개발자 입장에선 이게 얼마나 힘들고 불필요한 행동 인것이가? 라고 생각할때쯤 등장 한것이 바로 JAVA이다.

 

2. JVM


그렇게 위에 내용의 단점을 뒤집기 위해 등장한 JAVA 그렇다면 어떻게 개발이 되길래 OS 종속성이 없는것인가?

JAVA 개발 과정 (출처 : https://velog.io/@jungmyeong96/JAVA%EA%B8%B0%EC%B4%88-JVM%EC%9D%B4%EB%9E%80)

 

겉보기에는 C언어와 개발과정이 비슷해 보이겠지만, 자세히보면 JAVA는 Java VM이라는 놈이 중간에 추가 되었다.

그렇다 Java VM이라는 놈에서 OS별로 동작할수 있게 처리를 해주고 있는것이다. 그래서 JAVA로 개발된 언어는 실로 OS에 종속성이 없는 대신 속도가 느린 형태로 현재 서비스를 제공 해주고 있다.

 

그렇다고 우리가 아직 와! JAVA 너무 편리하고 좋다! 라고 하기에는 내용이 아직 부족하다. 그 이유는 아래와 같다.

C언어 개발과정에서 링커라는 곳에서 각종 외부 라이브러리들 참조하여 개발이 되는데, 반면 JAVA 개발과정에서는 눈씻고 찾아봐도 링커와 같은 처리 과정이 없는 것이다. 그럼 JAVA는 외부 라이브러리를 사용할수 없는 것인가? 라고 생각할수 있다. 답은 NO! 이에 대한 답은 사실 JVM안에 있다.

 

3. JVM 너 안에는 어떻게 생겼니?


JAVA가 외부 라이브러리 처리과정이 궁금해 JVM에 대해 알아볼려고 한다. JVM 내부는 아래 그림가 같이 생겼다.

JVM (출처 : https://velog.io/@jungmyeong96/JAVA%EA%B8%B0%EC%B4%88-JVM%EC%9D%B4%EB%9E%80)

비로서 위 그림을 보고서야 JVM에서 어떠한 처리를 해주는지 알수 있게 되었다. 그렇다 JVM안에 Class Loader라는 모듈을 이용해서 외부에 라이브러리들을 import해 링킹해주고 있다. 그래서 우리가 외부 라이브러리를 JRE에 담아 사용하는 이유가 되는것이고, 코드상으로 동적으로 Class Loader API를 이용해 외부 라이브러리를 링킹할수 있게 되는것이다. 해당부분은 추후 Reflection 기술에 대해서 이해할때 도움이 많이 된다. 여기서 잠깐 예제를 보고 넘어 가자면 아래와 같다.

 

ClassLoader cl = . . . // ClassLoader의 객체를 생성한다.
  Class klass = null;
  try {
     klass = cl.loadClass("java.util.Date");
  } catch(ClassNotFoundException ex) {
     // 클래스를 발견할 수 없을 경우에 발생한다.
     ex.printStackTrace();
  }

(출처 : https://javacan.tistory.com/entry/1)

 

ClassLoader를 이용해서 java.util.Date 라이브러리를 동적으로 Import하는 코드이다.

 

4. 마무리


이와 같이 JVM에 대해서 알아보면서 전체적으로 JAVA 동작과정에 대해서 동시에 볼 수 있었다. 아무래도 JAVA 동작에 대한 이론이라 그런지 처음에 굉장히 낯설었는데, 구조를 계속 보다보니 이해가 된다. 앞으로 이 포스팅을 본 개발자들이 쉽게 이해하는 바람으로 남긴다.