dev-sohee 님의 블로그
JDK vs JRE 본문
저는 첫 직장의 첫 프로젝트에서 C언어로 개발을 시작했습니다. 반복문이나 연산이 많은 프로그램에서 C언어의 저수준 접근 방식은 코드 최적화에 유리하여 고성능 애플리케이션을 작성할 수 있다는 장점이 있고 메모리 관리나 포인터 같은 개념을 깊이 이해하는 데 큰 도움이 되었습니다. 그러나 시간이 지나면서 소프트웨어 개발의 복잡성이 증가할수록, 대규모 소프트웨어 개발에 효율적인 프로그래밍 언어의 필요성을 느꼈고 자바를 공부하기 시작했습니다. 자바의 구동원리에 대해 공부하면서 JVM(Java Virtual Machine)에 대해 알게 되었습니다. 처음에는 단순히 자바 프로그램을 실행하기 위한 환경으로만 생각했지만, 점차 그 내부 구조와 동작 원리에 대해 더 깊이 이해하고 싶어졌습니다.
JVM은 자바 프로그램을 실행시키기 위한 가상의 컴퓨터입니다. 왜 컴퓨터에서 바로 실행시키지 않고 이런 복잡한 방법으로 자바 소스를 실행시키는 것일까요? 이 글은 그 이유를 탐색하고, JVM을 실행시키기 위해 꼭 필요한 JDK와 JRE에 대해 알아보는 글입니다.
* JDK
* JRE
컴퓨터는 인간의 언어를 이해하지 못합니다. 그래서 인간의 언어를 기계어로 번역을 해줘야 합니다.
이것을 컴파일이라고 합니다.
그런데 여기서 문제는 바로 컴퓨터마다 알아듣는 기계어가 다르다는 것입니다.
(2진 숫자인 0과 1로만 표현된다는 것은 공통이지만, 기계어 코드는 CPU마다 다릅니다.)
그래서 컴파일이란 기술이 등장하기 전 최초의 프로그래머들은
CPU마다 소스파일을 만들어 기계어를 입력해줘야 했습니다.
**기계어란?: CPU 또는 MPU 제조사에서 CPU를 만들어 낼 때 해당 CPU에서 사용하는 명령어 집합
바로 이때 C언어가 등장합니다.
C언어는 컴파일러를 통해 하나의 소스 파일을 기종마다 다르게 번역하여 기종마다 기계어 목적파일을 생성합니다.
즉, 컴파일러만 있으면 하나의 소스 파일로 모든 컴퓨터에서 동일한 실행이 가능해진 것입니다.
**목적파일이란?: 고수준 프로그래밍 언어(C, C++, 자바 등)로 작성된 소스 코드가 기계어로 번역된 중간 결과물로, 컴파일러는 소스 코드를 기계어로 번역하고, 그 결과를 목적 파일로 저장합니다. 직접 실행할 수는 없지만 여러 목적 파일을 링크하여 최종 실행 파일을 생성하는 데 중요한 역할을 합니다. 이를 통해 프로그램의 모듈화, 컴파일 속도 향상, 코드 재사용성을 높일 수 있습니다.
하지만 여전히 컴퓨터마다 목적 파일이 다르게 생성된다는 것은 변함이 없습니다.
그래서 바로 JVM 환경의 Jit-Compiler가 등장하게 된 것입니다.
아래의 방법으로 프로그래머들은 기종이 몇 개든 상관없이 단 하나의 JVM용 기계어만 생성할 수 있게 되었습니다.
(더 자세한 내용은 '자바의 두뇌 2탄: JVM의 모든 것'에서 다루겠습니다.)
- 프로그래머는 자바 소스 코드(.java)를 작성합니다.
- 자바 컴파일러(javac)로 소스 코드를 바이트코드(.class 파일)로 변환합니다.
- 바이트코드는 JVM에서 실행됩니다.
- 각 플랫폼에 맞는 JVM이 바이트코드를 해당 플랫폼의 기계어로 변환하여 실행합니다.
이제 JVM을 어떻게 사용하는지 알아보기 위해 JDK와 JRE에 대해 설명해보겠습니다.
# JDK
JDK(Java Development Kit)는 자바 애플리케이션을 개발하기 위해 필요한 도구와 라이브러리의 모음입니다.
구성요소는 다음과 같습니다.
- 컴파일러 (javac): 자바 소스 코드를 바이트코드로 컴파일합니다.
- JRE (Java Runtime Environment): 자바 애플리케이션을 실행하는 데 필요한 환경
- 애플리케이션 개발 도구: 디버거 (jdb), 자바 아카이브 도구 (jar), 문서 생성기 (javadoc) 등
- 표준 자바 클래스 라이브러리: 자바 애플리케이션에서 사용할 수 있는 표준 라이브러리들
즉, JDK는 자바 애플리케이션을 개발하고 컴파일하며 디버깅하는 데 필요한 모든 도구를 제공합니다.
# JRE
JRE(Java Runtime Environment)는 자바를 위한 운영체제, 즉 자바용 OS입니다.
구성요소는 다음과 같습니다.
- JVM (Java Virtual Machine): 자바 바이트코드를 실행하는 가상 머신
- 클래스 라이브러리: 자바 애플리케이션에서 사용할 수 있는 표준 클래스 라이브러리
- 런타임 환경: 자바 애플리케이션이 실행되는 동안 필요한 기타 파일들과 라이브러리들
JRE는 자바 애플리케이션을 실행하는 데 필요한 최소한의 환경을 제공하며, 개발 도구는 포함하지 않습니다.
즉, 자바 애플리케이션을 개발하려면 JDK가 필요하고,
자바 애플리케이션을 실행하려면 JRE만 있으면 됩니다.
이제 JVM을 공부하기 위한 기초 단계가 끝났습니다.
JVM에 대한 해부는 '자바의 두뇌 : JVM의 모든 것'에서 다루겠습니다.(https://dev-sohee.tistory.com/3)
'java' 카테고리의 다른 글
Java 8, Java 11, Java 17 뭐가 달라졌는지 알고 사용하자 (0) | 2024.07.28 |
---|---|
JVM의 청소부, GC(Garbage Collector) (0) | 2024.07.13 |
JVM의 부스터, JIT-Compiler (0) | 2024.07.13 |
인터페이스와 추상 클래스, 둘 중 뭘 써야 하는거지? (0) | 2024.07.06 |
자바의 두뇌 : JVM의 모든 것 (0) | 2024.07.06 |