JVM, JRE, JDK : 차이점은 무엇인가요?

팀원들이 보는 앞에서 벽에 글을 쓰는 엔지니어

Java는 오늘날 개발 환경에서 사용되는 가장 인기 있는 프로그래밍 언어 중 하나입니다. 주로 백엔드 개발 프로젝트, 게임 개발, 데스크톱, 모바일 컴퓨팅에 사용됩니다. 이어지는 내용을 통해 JVM(Java virtual machine), JRE(Java Runtime Environment), JDK(Java Development Kit)가 각각 Java 개발 과정에서 어떤 역할을 하는지 알아보세요. 또한 이들의 상호 관계와 차이점도 함께 확인할 수 있습니다.

JVM(Java Virtual Machine)이란 무엇인가요?

JVM(Java virtual machine)은 Java 바이트코드를 로드하고 검증하며 실행합니다. Java 프로그램을 실행하기 때문에 Java 프로그래밍 언어의 인터프리터이자 핵심으로 불립니다.

Java에서 JVM의 역할

JVM은 바이트코드를 머신별 코드로 변환하는 역할을 하며 JDK와 JRE 모두에서 필요합니다. 또한 플랫폼에 따라 다르며 메모리 관리 및 보안을 포함한 많은 기능을 수행합니다. 또한 JVM은 다른 프로그래밍 언어로 작성된 프로그램도 실행할 수 있는데, 이들 프로그램이 Java 바이트코드로 변환된 경우에 한합니다.

JNI(Java Native Interface)는 JVM과 관련하여 자주 언급됩니다. JNI는 JVM에서 실행되는 Java 코드가 하드웨어 및 특정 운영 체제 플랫폼과 연관된 애플리케이션과 통신할 수 있도록(즉, 호출하거나 호출될 수 있도록) 해 주는 프로그래밍 프레임워크입니다. 이러한 애플리케이션을 네이티브 애플리케이션이라고 하며 다른 언어로 작성되는 경우가 많습니다. 네이티브 메서드는 다른 언어로 작성된 네이티브 코드를 Java 애플리케이션으로 이동하는 데 사용됩니다.

JVM 구성 요소

JVM은 다음과 같은 세 가지 주요 구성 요소 또는 하위 시스템으로 구성됩니다.

  • 클래스 로더 서브시스템은 Java 클래스 파일(즉, 'Java 파일')을 로드하고 연결하며 초기화하는 역할을 담당하며, 이는 동적 클래스 로딩이라고도 합니다.
  • 런타임 데이터 영역에는 메서드 영역, PC 레지스터, 스택 영역, 스레드가 포함됩니다.
  • 실행 엔진에는 인터프리터, 컴파일러, 가비지 수집 영역이 포함되어 있습니다.

JRE(Java Runtime Environment)이란 무엇인가요?

JRE(Java Runtime Environment)는 시스템에서 Java 프로그램이나 애플리케이션을 실행하는 데 필요한 소프트웨어 도구 모음입니다.

JRE는 Java 오브젝트의 동적 메모리 할당을 위해 힙 공간을 사용합니다. JRE는 JDB(Java Debugging)에서도 사용됩니다.

Java에서 JRE의 역할

프로그래머가 Java 명령을 사용하여 Java 프로그램을 실행하려면 JRE를 설치해야 합니다. 설치만 하는 경우(코드를 개발하거나 컴파일하지 않는 경우) JRE만 필요합니다.

JRE 구성 요소

Java Virtual Machine 외에도 JRE는 Java 애플리케이션을 최대한 활용할 수 있는 다양한 기타 지원 소프트웨어 도구 및 기능으로 구성되어 있습니다.

  • 배포 솔루션: 배포 솔루션: JRE 설치에 포함된 배포 기술에는 애플리케이션 실행을 간소화하고, 향후 Java 업데이트를 지원하는 Java Web Start와 Java 플러그인이 있습니다.
  • 개발 툴킷: JRE에는 개발자가 사용자 인터페이스를 개선하는 데 도움이 되도록 설계된 개발 도구도 포함되어 있습니다. 이러한 툴킷에는 다음이 포함됩니다.
    • Java 2D: Java 언어로 2차원 그래픽을 그리는 데 사용되는 API(애플리케이션 프로그래밍 인터페이스)입니다. 개발자는 풍부한 사용자 인터페이스, 특수 효과, 게임, 애니메이션을 만들 수 있습니다.
    • AWT(Abstract Window Toolkit): 개체, 단추, 스크롤 바, 창을 만드는 데 사용되는 GUI(그래픽 사용자 인터페이스)입니다.
    • Swing: 다양한 위젯 세트를 사용하여 유연하고 사용자 친화적인 사용자 지정을 제공하는 또 다른 경량 GUI입니다.
  • 통합 라이브러리: Java Runtime Environment는 개발자가 애플리케이션과 서비스 간에 원활한 데이터 연결을 구축하는 데 도움이 되는 여러 통합 라이브러리와 클래스 라이브러리를 제공합니다. 이러한 라이브러리 중 일부는 다음과 같습니다.
    • Java IDL: CORBA(Common Object Request Brokerage Architecture)를 사용하여 Java 프로그래밍 언어로 작성된 분산 오브젝트를 지원합니다.
    • JDBC(Java Database Connectivity) API: 개발자가 원격 관계형 데이터베이스, 플랫 파일, 스프레드시트에 액세스할 수 있는 애플리케이션을 작성할 수 있도록 도와주는 도구입니다.
    • JNDI(Java Naming and Directory Interface): 클라이언트가 네이밍 규칙을 이용해 데이터베이스에서 정보를 가져오는 휴대용 애플리케이션을 만들 수 있도록 지원하는 프로그래밍 인터페이스이자 디렉토리 서비스입니다.
  • 언어 및 유틸리티 라이브러리: JRE에는 Java.lang과 Java.util 패키지가 포함되어 있으며, 이 패키지들은 Java 애플리케이션 설계, 패키지 버전 관리, 운영, 모니터링의 기본이 됩니다. 이러한 패키지 중 일부는 다음과 같습니다.
    • 컬렉션 프레임워크: 애플리케이션 데이터의 저장 및 처리를 개선하도록 설계된 인터페이스 컬렉션으로 구성된 통합 아키텍처입니다.
    • 동시성 유틸리티: 고성능 스레딩 유틸리티를 갖춘 강력한 프레임워크 패키지입니다.
    • Preferences API: 동일한 컴퓨터에서 여러 사용자가 각자의 애플리케이션 환경 설정 그룹을 정의할 수 있도록 하는 경량 크로스 플랫폼 지속형 API입니다.
    • 로깅: 보안 실패, 구성 오류, 성능 문제 등의 로그 보고서를 생성하여 추가 분석을 수행합니다.
    • JAR(Java Archive): 플랫폼에 구애받지 않는 파일 형식으로, 여러 파일을 JAR 파일로 묶어 다운로드 속도를 높이고 파일 크기를 줄일 수 있습니다.

JDK(Java Development Kit)란 무엇인가요?

JDK(Java Development Kit)는 JRE의 상위 집합인 소프트웨어 개발 키트입니다. Java 애플리케이션 및 Java 애플릿 개발을 가능하게 하는 기본 구성 요소입니다. 플랫폼에 따라 다르므로 각 운영 체제(예: Mac, Unix, Windows)마다 별도의 설치 프로그램이 필요합니다.

Java에서 JDK의 역할

JDK에는 Java 플랫폼을 사용하여 개발된 프로그램을 컴파일하고 디버그하며 실행하는 데 필요한 모든 도구가 포함되어 있습니다. (Java 프로그램은 명령줄을 사용하여 실행할 수도 있습니다.)

JDK 구성 요소

JDK에는 Java 프로그램을 실행하는 데 필요한 모든 Java 도구, 실행 파일, 바이너리가 포함되어 있습니다. 여기에는 JRE, 컴파일러, 디버거, 아카이버, 그리고 Java 개발에 사용되는 기타 도구가 포함됩니다.

Java SE와 Java EE 비교

Java는 Java SE(Java Standard Edition) 또는 Core Java와 동일한 의미로 사용됩니다. 세 가지 표현 모두 유형과 객체를 정의하는 기능을 포함하는 Java 기본 사양을 가리킵니다. 반면에 Java EE는 API를 제공하며 일반적으로 대규모 애플리케이션을 실행하는 데 사용됩니다. 이 블로그는 Java SE를 중심 내용으로 다룹니다.

JVM, JRE, JDK가 함께 작동하는 방식

먼저 Java의 세 가지 핵심 구성 요소가 어떻게 함께 작동하는지 살펴본 다음 차이점을 살펴보겠습니다. 다음 다이어그램에서는 JVM, JRE, JDK가 Java 환경에서 서로 어떻게 구성되고 연관되는지 보여줍니다.

야구공을 단면으로 상상해 보면, 공은 쿠션이 있는 둥근 코어, 양모와 면으로 된 중간층, 소가죽으로 된 외피의 세 가지 주요 구성 요소로 이루어져 있습니다. 이 세 가지 층 중 하나라도 없는 공은 의도한 기능을 제대로 수행하지 못합니다. 야구공의 세 가지 기본 요소와 마찬가지로 JVM, JRE, JDK에는 모두 특정 기능이 있습니다. 이 세 가지 모두 없이는 Java는 제대로 작동하지 않습니다.

JVM, JRE, JDK 비교

다음 동영상에서 Jamil Spain이 JRE와 JDK의 관계를 자세히 설명합니다.

JDK, JRE, JVM: 주요 차이점

이제 차이점을 살펴보겠습니다.

  • JDK는 개발 플랫폼이며 JRE는 실행용 플랫폼입니다.
  • JVM은 Java 프로그래밍 언어의 기초이자 핵심으로, 프로그램의 Java 소스 코드가 특정 플랫폼에 종속되지 않도록 보장합니다.
  • JVM은 JDK와 JRE 모두에 포함되어 있으며, JVM이 없으면 Java 프로그램이 실행되지 않습니다.

보완 기술

JVM, JRE 또는 JDK를 향상시키는 데 사용할 수 있는 많은 보완 기술이 있습니다. 가장 자주 사용되는 기술은 다음과 같습니다.

  • JIT(Just-In-Time Compiler)는 JVM의 일부이며 바이트코드를 기계어 코드로 변환하는 것을 최적화합니다. 동시에 컴파일할 유사한 바이트코드를 선택하여, 바이트코드를 기계어 코드로 변환하는 전체 시간을 단축합니다.
  • 또 다른 보완 도구인 Javac은 Java 정의를 읽고 JVM에서 실행할 수 있는 바이트코드로 변환하는 컴파일러입니다.
  • Javadoc은 API 문서를 자바 소스 코드에서 HTML로 변환합니다. HTML로 표준 문서를 만들 때 유용합니다.

JVM 및 컨테이너 기술

JVM(Java virtual machine)은 가상 머신(VM)을 만드는 데 사용됩니다. VM은 여러 애플리케이션이 서로 영향을 주지 않고 동일한 기본 물리적 하드웨어에서 실행할 수 있도록 하는 서버입니다. 이를 통해 리소스를 더 잘 사용할 수 있으며 기존 인프라보다 훨씬 쉽고 비용 효율적으로 확장할 수 있습니다. 또한 VM은 독립적이기 때문에 쉽게 폐기할 수 있습니다. 애플리케이션이 더 이상 필요하지 않으면 VM을 종료하기만 하면 됩니다.

컨테이너는 이러한 추상화를 한 단계 더 발전시켜 OS 커널을 가상화합니다. OS가 없기 때문에 컨테이너는 VM보다 훨씬 더 가볍고 빠르며 유연합니다.

Java, JVM, JDK, JDK, 그리고 IBM

많은 조직에서 Java는 여전히 애플리케이션 개발의 핵심 요소로, 이식 가능하고 확장 가능한 솔루션을 만들 때 안정적인 기반을 제공합니다. 또한 클라우드로 전환하는 과정에서 애플리케이션을 현대화하는 데 중요한 역할을 할 수 있습니다.

OpenJDK와 IBM Runtimes for Business를 살펴보고 한 단계 더 나아가세요. 이들은 Java 애플리케이션의 구현, 모니터링, 관리에 필요한 안정적이고 비용 효율적인 상업적 지원을 제공합니다.