Java

JDK, JRE, JVM 그게 뭔데

Big Iron 2025. 7. 18. 08:46

오늘은 JDK, JRE, JVM에 대해 정리해봤다

자바 공부하다 보면 맨날 헷갈리는 단골 질문
"JDK, JRE, JVM 이게 뭔데?"
오늘은 이 셋의 관계랑, 바이트코드가 뭔지도 같이 정리해봤다.

 


JDK (Java Development Kit)

 

-> 범위가 가장 큰 놈이다.

  • 말 그대로 자바 개발 도구 모음 세트
  • 개발자가 작성한 소스코드를 .java로 만들고, .class로 컴파일하고, 디버깅하고 실행까지 다 해볼 수 있다.
  • 실제로 개발할 땐 이걸 설치해야 하고 JDK에 JRE, JVM 다 포함됨

예) javac(컴파일러), jdb(디버거), jar(압축 툴) 등등 개발자 도구가 다 들어있음

 

 


JRE (Java Runtime Environment)

  • 개발 도구는 빠진 대신, 자바 프로그램을 실행할 수 있는 환경
  • JRE는 실행 환경으로, 진짜 코드를 실행하는데 어려움이 있음
  • 이미 바이트코드로 컴파일된 .class 파일이 있으면 실행 가능하나,
    .java 파일을 .class 파일로 컴파일하는 컴파일러가 없기때문

기본적으로 사용하는 Scanner, ArrayList, System.out 같은 클래스들은
여기 들어있는 라이브러리(JAR 파일) 덕분에 쓸 수 있는 것.

 

 


JVM (Java Virtual Machine)

  • 진짜로 자바를 실행시키는 것
  • .class 파일(바이트코드)을 읽고, 컴퓨터가 실행할 수 있도록 기계어로 바꿔준다

내부 로직은 

[Class Loader] → [ .class 파일 보안 검사] → [메모리 적재][Execution Engine]
  • 클래스 로더가 .class 파일을 읽어서 보안 검사
  • 메모리(힙, 스택, 메서드영역 등)에 올리고
  • Execution Engine이 기계어로 바꿔서 실행시킨다

조금 더 풀어서 설명하자면

1. 개발자가 작성한 소스코드 .java 파일을 JDK의 컴파일러 javac가 바이트코드인 .class 파일로 변환

2. 바이트 코드를 기계어로 변환하기 위해 클래스로더가 바이트코드 보안 검사 후 내부 데이터를 각 메모리에 올림

3. 메모리에 담긴 데이터를 Execution Engine이 기계어로 변환시키는데 방법은 두 가지

     - 데이터를 한 줄씩 해석, 실행하는 인터프리터

     - 데이터를 한번에 해석, 실행하는 jit 컴파일러(자주 쓰이는 코드는 미리 기계어로 변환) -> 이 부분은 조금 더 알아볼 필요가 있음

 

 


바이트코드?     

개발자가 작성한 소스코드인 .java 파일을 컴파일하면 나오는 게 .class 파일인데,
이 안에 들어있는 코드가 바로 바이트코드다.

  • 사람이 직접 읽진 않지만 JVM이 읽을 수 있는 중간 언어
  • 기계어(0101...)는 아니고, 그 전에 JVM이 보는 언어

바로 실행 못 하니까, JVM의 인터프리터나
JIT 컴파일러로 해석, 진짜 기계어로 바꿔서 실행시킴.

 


JRE의 라이브러리?

코드를 작성할 때 바로 사용할 수 있는 String, System, Scanner, List, Map 같은 자바 기본 기능들.

전부 라이브러리 파일에 들어 있는 클래스들임.

 


간단히 정리하자면 

자바는 .java -> 컴파일 -> .class(바이트코드) -> JVM -> 기계어 흐름으로 실행됨

 

  • JDK = JRE + 개발도구 (코딩, 컴파일, 디버깅 가능)
  • JRE = JVM + 실행용 라이브러리 (실행만 가능)
  • JVM = .class 파일을 기계어로 변환해서 실행시켜주는 애
  • 바이트코드 = JVM이 읽는 중간 언어
  • 기계어 = 진짜 0101... CPU가 실행하는 코드