JVM, JRE, JDK의 개념 / 포함관계

방충림·2023년 3월 21일
4

CS

목록 보기
16/26
post-thumbnail

컴퓨터를 사용하다보면 꽤나 다양한 상황에서 JDK라는 것을 다운받아야하는 경우가 생긴다.
일단 하라고 하니 다운받긴 받았는데, 자바랑 관련 있다는 것만 알고있을 뿐 도통 이게 뭔지..
우연히 그 개념과 또 그와 관련된 JVM, JRE까지 설명해준 영상이 있어 참고하여 게시물을 남긴다.

JVM(Java Virtual Machine)

  • 머신이라는 말이 들어가서 굉장히 거창해보이는데 그냥 프로그램이다.
  • 컴퓨터는 우리가 사용하는 코딩언어를 알아듣지 못한다. 그저 바이너리로 작성된(2진수로 된) 기계어만 알아 들을 수 있을 뿐이다. 이렇게 기계어로 바꿔주는 작업을 C나 JAVA같은 언어에서는 컴파일이라고 한다.
  • 우리가 코딩한 결과가 미리, 기계어나 그에 가까운 언어로 컴파일 즉 "번역"이 되는것이다.
  • 그런데 컴퓨터들이 또 같은 기계어를 쓰는 것이 아니다. 0과 1로 되어있다고 다 같은 언어가 아니란다.
  • 똑같이 C로 짜서 컴파일한 기계어인데, 윈도우에서 돌게 컴파일 한 것은 맥이나 리눅스에서는 또 안 돌 수있다. 프로그램이 돌 환경과 컴퓨터마다 거기에 맞는 기계어로 일일이 번역을 해줘야한다.
  • 쉽게 비유해서 말하자면 각각 컴퓨터마다 JVM이라는 "전담 통역센터"가 있는 것이다.
  • 자바로 코딩하고 나서 컴파일 하면 기계어는 아니고, 바이트코드라는게 생긴다. 사람이 쓰는 자바 코드와 컴퓨터가 읽는 기계어의 중간단계에 있는 코드라고 생각하면 된다.
  • 예를들어, 자바 언어로 Hello.java 라는 파일을 작성하고, 파워쉘에나 터미널에 javac java Hello.java 명령을 내리면 같은 위치에 Hello.class가 만들어 지는데 이 파일이 바이트 코드인 것이다. (javac는 자바 컴파일러다.)
  • 이 바이트코드를 실행할 컴퓨터에 깔린 JVM에 갖다주면, 그 컴퓨터가 이 프로그램을 실행할 때 이 JVM이 바이트 코드를 그때그때 기계어로 통역해주는 것이다.
  • 바이트코드를 쓰면 또 좋은 점이 자바 뿐아니라 Groovy나, Scala, Clojure, Kotlin 같은 언어들도 다 JVM전용 바이트코드로 컴파일이 된다. 즉 그 언어들로도 JVM을 돌리는 기계어에서의 프로그램을 짤 수 있는 것이다.
  • +) JVM처럼 주어진 코드를 그때그때 기계어로 '통번역'을 해주는 방식을 Just In Time 컴파일, 줄여서 JIT컴파일 이라고 한다.

쉽게 말해 JVM은 자바로 짜서 컴파일한 소프트웨어들이 JVM이 깔린 어떤 종류의 컴퓨터에서든 돌 수 있게 해주는 것

  • 그래서 '한번 작성하면 모든 곳에서 실행한다' Write Once Run Anywhere (W-O-R-A)가 자바의 원칙인 것이다.

JRE(Java Runtime Environment)

  • 런타임 이라는 것은 컴파일 타임과 대조되는 말이다.
  • 컴파일이라는 것은 코딩을 다 하고 이것을 실행하거나 배포하기 전에 '미리'해두는 번역 작업이고, 이걸 하는 시점을 컴파일 타임이라고 한다.
  • 런타임은 반대로 이걸 run, 실행하는 시점을 말한다.

즉, JRE 자바런타임 환경이라는 것은 자바로 짠 소프트웨어가 컴파일 및 빌드까지만 된 다음 이를 사용할 곳에 주어져서 실행이 될 때 그 환경 요소들로서 필요한 것인 것이다.

궁금증 # JVM이 이 있다면 왜 또 JRE이라는게 필요한건데?

  • 소프트웨어라는게 딱 우리가 자바나 그런 언어로 작성한 코드만으로 돌아갈 수 있는게 아니다. - 예를 들어서 우리가 자바의 자료구조 기능들인 List나 Map, set 같은 것을 사용할 수 있는 이유는, 우리가 그런 기능들을 일일이 다 구현 했기 때문이 아니라, 그것들이 바이트 코드로 컴파일 된 클래스로 제공되기 때문이다.
  • 이와같은 이유로 컴퓨터에서 rt.jar이라는 것을 찾아서 압축을 풀어보면 List.class 등등 기능들이 class형태로 다 저장되 되어 있는 것을 알 수 있다.
  • 그래서 이처럼 널리 쓰이는, 그리고 JVM에서 도는 라이브러리들을 JVM이랑 세트로 묶어다가 다운받아 설치할 수 있도록 한 것이 자바 런타임 환경 JRE인 것이다.
  • 윈도우에서 가끔 무슨 프로그램 설치할 때, 자바 필요하다면서 같이 설치됐던게 JRE이 인 것이다.
  • 어떤 컴퓨터든 이 JRE만 깔리면 자바로 작성한 프로그램을 돌릴 수 있게 되는 것이다.
  • JRE는 JVM도 포함하고 있다.

JDK(Java Development Kit)

  • 그런데 오라클에 들어가보면 자바 11부터는 JRE는 안 보이고 JDK이라는 것만 보이는 것을 알 수 있다.
  • JDK는 말 그래도 자바 개발 도구의 약자이다.
  • JRE가 JVM을 포한하는 것처럼 JDK도 JRE를 포함한다.

JRE에다가 개발에 필요한 것들, 이를테면 자바 코드를 컴파일할 때 쓰는 javac, 자바를 디버깅할 때 쓰는 jdb, 서로 연관 있는 클래스들을 하나의 JAR파일로 묶어주는 jar 등등 최종사용자가 아닌 프로그래머를 위한 기능들도 같이 탑재를 하고 있는 것이 JDK이다.

  • 어차피 용량을 그다지 크지 않음.
  • JDK도 종류가 여러가지긴하다. 자바라는 언어 자체는 무료지만 JDK중에 대표적으로 오라클에서 배포하는 Oracle JDK등은 상업적 이용에 한해서 무료이다.(개인은 공짜로 가능) 그 외에도 여러 회사의 엄청 다양한 JDK가 존재한다.
  • 유료버전이 성능이랑 안정성, 최신 기능 등에서 나은 면들이 있다. 그래서 큰 업체들은 그런 버전을 많이 쓴다.
  • 하지만 Open JDK들도 이를 많이 따라잡은 상태고, 좋은 것들은 Oracle JDK 못지 않게 쓸만하다고한다. 서비스의 규모나 특성에 따라 적합할 것을 선택하면 된다.


    깔끔한 개념정리 아주 속이 다 시원하다!!



참고문헌 : 얄팍한 코딩사전

profile
최선이 반복되면 최고가 된다.

0개의 댓글