[Java] JDK / JRE / JVM 개념

Kim Hyen Su·2024년 3월 9일
0

📐Java

목록 보기
1/18
post-thumbnail

참고 포스팅

📐JDK(Java Development Kit)


JDK는 자바 개발 키트의 약자로 개발자들이 자바 애플리케이션을 개발하는데 사용되는 SDK 라고 생각하면 됩니다.

SDK : 소프트웨어 개발 도구, 개발자를 위한 플랫폼별 구축 도구 세트입니다.

다음 그림에서 알 수 있듯이 JDK 안에는 JVM, JRE 뿐만 아니라 자바를 개발하는데 필요한 development tools도 함께 포함하고 있습니다.


JDK 버전 표기

자바의 버전을 표현할 때에는 보통 JDK 또는 Java SE 버전으로 나타냅니다.

초기 버전인 1.0/1.1 버전에서는 JDK 1.0/ JDK1.2 이런 방식으로 버전을 명시했지만, JDK 1.2를 발표하면서 J2SE로 변경, 2006년 JDK 1.6부터 Java SE(Standard Edition)으로 변경되었습니다.

실제로 공식 사이트에 JDK 다운로드 페이지에 아래와 같이 Java 버전이 표기되어 있습니다.

Java SE(Standard Edition) :

가장 기본이 되는 표준 에디션의 자바 플랫폼으로 자바 언어의 핵심기능을 제공

  • 가장 기본적인 클래스 패키지로 구성
  • PC용 애플리케이션, 응용프로그램 개발, 웹개발, 안드로이드 개발
  • PC에 설치하여 사용할 수 있는 모든 프로그램 개발에 관련된 것

Java EE(Enterprise Edition) :

대규모 기업용 에디션. SE 확장판(대형 네트워크 환경 프로그램 개발 시)

  • 기업환경을 위한 대규모 솔루션 개발

Java ME(Micro Edition) :

피쳐폰, 셉톱박스, 프린터와 같은 작은 임베디드 기기들을 다루는데 이용하는 에디션.

  • Java SE를 줄여 라이트하게 만든 것이므로 SE 개발이 가능하면 ME도 가능.

Java FX :

가볍고 예쁜 그래픽 사용자 인터페이스를 제공하는 에디션

  • 고성능의 하드웨어 그래픽 가속과 미디어 엔진 API를 제공해주어 프로그램의 성능에 신경을 써야 하는 분야에서 사용

정리하면, JAVA 11이라고 하는 것은 JDK 버전을 의미합니다. 즉, 자바 설치는 곧 JDK 설치와 같습니다.

  • 주 버전 : 자바 언어에 많은 변화가 있을 경우 증가
  • 개선 버전 : 주 버전에서 일부 사항이 개선될 때 증가
  • 업데이트 버전 : 1~3개월 주기로 버그가 수정될 때마다 증가
  • LTS : 장기 지원 서비스(Long Term Support)를 받을 수 있는 버전

JDK 종류

리눅스에 Ubuntu, CentOS, RedHat 계열이 나뉘듯이 자바(JDK)도 여러 종류가 있습니다.

JDK의 종류가 여러가지로 나뉘는 이유는 라이센스(저작권) 때문입니다.

Java 소스코드 자체는 오픈소스입니다.

그래서 오픈소스인 Java 소스코드를 빌드하여 사용하는 것에는 거의 제약이 없지만 Oracle에서 제공하는 설치버전의 JDK에는 위의 NFTC(No-Fee Terms And Conditions) 라이센스가 적용되어 회사에서는 무료로 사용이 불가능합니다.

위처럼 많은 JDK 종류들이 있지만, 주요한 JDK들은 다음과 같습니다.

  • Oracle JDK : Oracle에서 제공하는 JDK, 구독을 통해 유로 라이센스를 구매 가능합니다.
  • Open JDK : 유명한 무료 JDK 이지만, OpenJDK를 직접 사용하는 것 보다는 OpenJDK 기반으로 빌드된 JDK를 추천합니다.
  • Azul Zulu : 인지도가 높은 JDK 중 하나이며, Mac 등에서 사용할 수 있는 바이너리를 제공하는 것이 특징입니다.
  • Amazone Corretto : AWS에서 제공하는 JDK. AWS에서 쉽게 사용이 가능하며, AWS 환경이 아니더라도 사용 가능합니다.
  • Temurin(AdoptOpenJDK) : Eclipse에서 제공하는 JDK, Eclipse를 사용한다면 Temurin 설치를 추천합니다.

JDK 디렉토리 구성요소

  • bin : 자바 개발, 실행에 필요한 도구와 유틸리티 명령.
  • include : 네이티브 코드 프로그래밍에 필요하는 C언어 헤더 파일.
  • lib : 실행 시간에 필요한 라이브러리 클래스들
  • jmod : 자바의 모듈 파일(.jmd)을 만들거나 모든 파일의 내용 출력

Native Code : 특정 유형의 프로세서(CPU) 나 하드웨어 플랫폼에서 직접 실행되도록 설계된 컴퓨터 프로그래밍 코드. (해당 플랫폼에서만 사용되기 때문에 성능이 좋음.)

bin Directory에 들어있는 개발 프로그램

  • javac : 자바 컴파일러로 자바 소스를 바이트 코드로 컴파일.
  • java : 자바 인터프리터. 컴파일러가 생성한 바이트 코드를 해석하고 실행
  • javadoc : 자바 소스로부터 HTML 형식의 API 도큐먼트 생성
  • jar : 자바 클래스 파일을 압축한 자바 아카이브 파일(.jar) 셍성, 관리하는 압축 프로그램
  • jlink : 응용프로그램에 맞춘 맞춤형 JRE 생성
  • jdb : 자바 응용프로그램의 실행 중 오류를 찾는데 사용하는 디버거
  • javap : 역어셈블러. 컴파일된 클래스 파일을 원래의 소스코드로 변환


📐 JRE(Java Runtime Environment)


JRE는 자바실행환경의 약자로써, JVM과 자바프로그램을 실행시킬 때 필요한 라이브러리 API를 함께 묶어서 배포되는 패키지입니다. 이외에도 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일(jar 파일)을 가지고 있습니다.

JRE는 기본적으로 JDK에 포함되어 있기 때문에 JDK를 설치하면 함께 설치됩니다.

기존에는 개별적으로 설치가 가능했지만 JDK 11 버전 부터는 따로 제공되지 않습니다.

간단하게 정리하면, Java로 프로그램을 직접 개발하기 위해서는 JDK가 필요하고, 개발된 프로그램을 실행시키기 위해서는 JRE가 필요합니다.



📐 JDK(Java Virtual Machine)


자바 가상 머신의 약자로써, 자바 프로그램을 실행시키는 프로그램 정도로 이해하면 됩니다.

JAVA라는 언어가 인기를 얻게된 핵심 이유 중 하나가 JVM 개념입니다.

JVM을 사용하면, 자바 프로그램을 OS 플랫폼에 의존하지 않고 어떤 환경에서도 동작이 가능하다는 점이 핵심입니다.

아래에 이에 자세한 내용에 대해 설명하겠습니다.


왜 JVM이 필요한가?

Java는 특정 OS에 종속되지 않는다는 특징을 가지고 있습니다.

특정 OS에 종속되지 않고 실행되기 위해서는 OS 위에서 Java를 실행시킬 무언가가 필요한데 그 역할을 하는 것이 JVM 입니다.

"특정 OS에 종속된다" 는 말의 의미

위 특징을 쉽게 설명할 수 있는 예시로 'C언어' 와 'java'를 비교하는 것입니다.

C언어의 실행(WOCA)

C언어는 WOCA(Wirte Once Compile Anywhere) 라는 특성을 갖습니다. 이는 개발자가 작성한 소스 코드를 컴파일러에 의해 기계가 이해하는 기계어로 변환되어 실행해주는 프로그램(exe)을 만들어 주는 것을 의미합니다.

이 때, 컴파일된 코드를 바이너리 코드(이진 코드, 기계어)라고 부릅니다.

즉, Write Once, Compile Anywhere : 한번만 작성하고 컴파일하면 어디서든 사용이 가능하다는 의미입니다.

그러나 번역된 바이너리 코드는 특정 OS나 CPU 구조에 맞게 설계된 컴파일러에 의해 OS마다 다르게 컴파일 된다는 특징이 있습니다.

이 말은, 주어진 환경에 따라서 다른 바이너리 코드를 컴파일하고 다른 환경에서는 이 바이너리 코드를 이해할 수 없다는 것을 의미합니다.

이를 다른 말로 "이식성이 낮다" 라고 표현합니다.

Java의 실행(WORA)

위와 같은 C언어의 OS에 종속적인 문제를 해결하기 위해서 JAVA(JVM)이 등장하게 됩니다.

JAVA 언어로 작성한 소스파일은 직접 운영체제로 가서 실행하는 것이 아닌, JVM을 거쳐서 운영체제와 상호작용하게 됩니다.

이 말의 의미는 JVM이 있다면, 운영체제에 상관없이 프로그램을 어디서든 실행시킬 수 있다는 것을 의미합니다.

즉, Write Once, Run Anywhere : 한번만 작성하면 어디서든 실행시킬 수 있다는 것을 의미합니다.

이것이 가능한 이유는 컴파일된 코드와 하드웨어/ OS 사이 중간에서 JVM이 각 환경에 맞게 Byte Code로 변환시켜주기 때문입니다.

즉, 재컴파일할 필요 없이 바로 기계가 읽고 실행할 수 있게 됩니다.

이를 다른 말로 "이식성이 높다." 고 합니다.

정리

정리하면, C언어는 컴파일 과정에서 소스 코드를 Binary Code(기계어)로 바로 변환하여 하드웨어에 의해 읽어지고, 이러한 이유로 OS에 종속적인 언어가 됐습니다. 이와 달리, Java는 다음의 과정을 통해 OS에 종속적이지 않게 됐습니다.

  1. Java Compiler가 Java로 작성된 소스 코드(.java) 파일을 .class 파일인 Byte Code로 컴파일 한다.( 단, 바이트 코드는 CPU에서 직접 동작이 불가능한 코드로써, JVM만 이해 가능한 코드를 말합니다.)

  2. 이제 이 Byte Code를 기계어로 변환시키기 위해 가상 CPU가 필요한데, 이걱이 JVM의 역할 입니다.

  3. OS마다 다른 JVM이 존재하여 동일한 Byte Code를 OS에 맞게 바이너리 코드(기계어)로 변환시켜줍니다.

  4. 이러한 바이너리 코드가 CPU에서 실행되어 사용자에게 서비스를 제공하게 됩니다.

Byte Code : 가상 머신(JVM, CLR 등)에서 사용되는 코드 개념으로, 가상 머신이 이해할 수 있는 중간 레벨로 컴파일한 코드를 말합니다.

장점만 있을 수는 없다

자바 프로그램은 JVM에 의해 컴파일 단계를 한번 더 거쳐야 하기 때문에, 상대적으로 실행 속도가 느리다는 단점이 있습니다.

이를 보완하기 위해 JIT 컴파일러라는 내부 프로그램을 사용하여 필요한 부분만을 기계어로 바꾸어 줌으로써 성능 향상을 가져오도록 했지만, 그럼에도 불구하고 속도 측면에서는 C언어의 실행 속도가 더 높습니다.

JIT 컴파일러(Just-In-Time Compiler)란?

기존의 자바는 인터프리터 방식으로 명령어를 하나씩 실행하게끔 이뤄져 있어 실행 속도가 느렸습니다. 하지만 하드웨어가 발전하면서 자바 실행엔진이 JIT 컴파일러 방식으로 개선됐습니다.

JIT 컴파일러는 동일한 코드를 매번 해석하지 않고, 실행할 때 컴파일을 하면서 해당 코드를 캐싱합니다. 이 후 바뀐 부분만 컴파일 하고 나머지 코드는 캐싱 저장소에서 가져와 사용하도록 합니다.

동적 번역(Dynamic Translation) 이라고도 불리는 이 기법은 이전의 인터프리팅 방식보다 10~20배 정도 성능이 좋습니다.

profile
백엔드 서버 엔지니어

0개의 댓글