JavaScript

웹 개발의 필수 언어

동적인 웹 페이지 구현을 위한 핵심 프로그래밍 언어.

Java

객체지향 프로그래밍

안정적이고 확장성 있는 백엔드 개발의 대표 언어.

HTML

웹의 기초

웹 페이지의 구조를 정의하는 마크업 언어.

React

현대적 UI 라이브러리

효율적인 사용자 인터페이스 구축을 위한 JavaScript 라이브러리.

CSS

웹 디자인의 핵심

웹 페이지의 시각적 표현을 담당하는 스타일 언어.

Spring

자바 웹 프레임워크

기업급 애플리케이션 개발을 위한 강력한 프레임워크.

Java/자바 학습

1. 자바 플랫폼 - 1. JDK, JRE, JVM의 차이

lamarcK 2025. 5. 12. 16:39

기본 이해

  • JDK (Java Development Kit): 자바 개발에 필요한 전체 도구 패키지
  • JRE (Java Runtime Environment): 자바 프로그램 실행 환경
  • JVM (Java Virtual Machine): 자바 바이트코드를 실행하는 가상 머신

비유:

  • JDK: 요리사의 전체 주방 도구세트
  • JRE: 음식을 데우고 먹을 수 있는 주방
  • JVM: 실제 요리를 하는 조리기구

핵심 구성요소

JDK:

  • 컴파일러 (javac)
  • 디버거 (jdb)
  • 문서 생성기 (javadoc)
  • JRE

JRE:

  • JVM
  • 자바 클래스 라이브러리
  • 실행 도구

JVM:

  • 클래스 로더
  • 실행 엔진
  • 가비지 컬렉터
  • 런타임 데이터 영역

존재 이유와 목적

  • JDK: 개발자가 자바 애플리케이션을 개발하기 위함
  • JRE: 개발된 자바 프로그램을 실행하기 위함
  • JVM: "Write Once, Run Anywhere" 구현을 위한 플랫폼 독립성 제공
  1. 주의사항과 일반적 오류
  • JDK 버전 호환성 문제
  • 환경 변수 설정 오류
  • JVM 메모리 설정 실수
  • 32비트/64비트 버전 혼용

비교 분석

크기: JDK > JRE > JVM
용도:

  • JDK: 개발용
  • JRE: 실행용
  • JVM: 실제 구동 엔진

실무 활용

환경 변수 설정 예시:

JAVA_HOME=C:\Program Files\Java\jdk1.8.0_291
PATH=%JAVA_HOME%\bin;%PATH%

JVM 메모리 설정:

java -Xms512m -Xmx1024m MyApp

이전 관련 개념:

  • 컴파일러와 인터프리터
  • 운영체제 기초
  • 프로그래밍 언어 기초

후속 학습 개념:

  • 가비지 컬렉션
  • 클래스 로더
  • 자바 메모리 구조
  • 스레드와 동기화

추가 사항


자바의 핵심 기술 JVM

이중 가장 핵심이 되는 요소는 JVM이다. Java Virtual Machine이라고 해서 이름 그대로 '가상 머신'이다.

에뮬레이터라는 말을 들어봤다면 이해가 빠를 것이다. 에뮬레이터는 어떤 것들을 실행하기 위해서 사용되는 프로그램인데 JVM은 모든 운영 체제에서 그런 역할을 한다.

즉 Java라는 프로그램 언어를 모든 운영체제(OS)에서 실행될 수 있도록 처리하는 역할을 한다.

   [Java 코드]
          ↓
[Java 컴파일러(javac)]
          ↓
    [바이트코드]
          ↓
   [JVM - 가상머신]
          ↓
[각 운영체제에 맞는 기계어]

 

기본적으로 프로그램들은 컴파일된 결과물(실행 파일)이 운영체제별로 달라진다. 이는 운영체제 자체가 각각 별개의 프로그램이기 때문이다. 

 

운영체제는 같은 프로그래밍 언어로 만들어졌더라도, 완전히 다른 설계 방식과 철학을 가지고 있다.

Windows: 
- GUI(그래픽 환경) 중심
- 사용자 편의성 우선
- 독점 소프트웨어 방식

Linux:
- 터미널(명령어) 중심
- 시스템 제어 권한 중시
- 오픈소스 방식

Mac:
- 독자적인 UI/UX
- 하드웨어-소프트웨어 통합 설계
- 폐쇄적 생태계
이처럼 OS들은 같은 C언어로 만들어졌더라도:

설계 철학이 다름
시스템 구조가 다름
리소스 관리 방식이 다름

설계 단계부터 차이가 있기 때문에 같은 언어라도 받아들이는 것이 달라지게 되는 것이다.

현실의 예를 들면 중국어와 한국어는 설계부터 차이가 있기 때문에 표현 방식이 완전히 달라진다. 같은 '한자'를 공유하긴 하지만 기본적인 구조가 다르기 때문에 발음도, 의미도 차이가 생긴다.

마찬가지로 C언어를 공통 기반으로 하는 윈도우와 맥도 실제로는 아웃풋이 달라지게 되는 것이다.

// 하나의 코드로 작성
public class Example {
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

// 다음 환경에서 모두 동일하게 실행 가능:
- Windows
- Linux
- macOS
- 모바일 기기
- 임베디드 시스템

하지만 여기서 JVM의 장점이 나온다. JVM은 가상 머신을 사용해서 자바 프로그램이 어떤 OS에서든 실행될 수 있도록 각 OS에 맞게 해석(interpret)해주는 중간 다리 역할을 한다.

물론 Java를 사용한다고 PC나 모바일에서 같은 환경을 제공하는 것은 아니지만 다른 프로그래밍 언어(Python, C++, JavaScript 등)은 각각의 OS별로 따로 컴파일/빌드 필요하지만 Java는 한번의 컴파일로 모든 곳에서 '호환'될 수 있다는 점이 차이점이다.

즉 하나의 실행 파일(.class)로 충분하다.


자바의 파일명과 class명이 일치하는 것과 JVM의 상관 관계

기본적으로 java가 클래스 중심으로 설계된 것은 순수 객체지향 언어를 목표로 설계됐기 때문에 그런 것이지만 클래스 단위로 설계가 OS간 호환성에 간접적인 영향을 줬다고 할 수 있다.

// Hello.java 파일
public class Hello {    // 파일명과 클래스명이 일치해야 함
    public static void main(String[] args) {
        System.out.println("Hello");
    }
}

이러한 클래스의 강제성으로 자바의 파일은 모두 표준화된 구조를 가지게 되었고 이는 클래스 단위로 모듈화가 된다는 것을 의미한다.

표준화된 구조
// 모든 Java 코드는 동일한 구조를 가짐
public class Example {
    // 항상 클래스 단위
    // 항상 같은 형태의 바이트코드 생성
}
//JVM의 예측 가능한 동작
[클래스 파일] → [JVM]
- 항상 정해진 형태로 들어옴
- 클래스 단위로 로딩
- 표준화된 방식으로 해석 가능
  1. JVM이 항상 같은 형태의 코드를 다룸
  2. 플랫폼별 해석 방식을 표준화하기 쉬움
  3. 일관된 동작 보장이 용이

결과적으로 이는

  • 예측 가능한 구조 → 안정적인 호환성
  • 표준화된 형식 → 다양한 플랫폼 지원 용이
  • 강제된 모듈화 → 유연한 플랫폼 최적화

를 자연스럽게 구현해서 다른 언어에 비해서 호환성을 확보하기 쉬운 토대가 된다.

[클래스 단위 설계]
      +
[JVM의 플랫폼 독립성]
      ↓
[효율적인 크로스 플랫폼 실행]

 

흔히들 구조화되지 않고 이리저리 꼬인 코드를 스파게티 코드라고 한다. 이처럼 구조화되지 않는 코드의 경우 프로그램 자체의 효율성을 떨어트리게게 된다. 반면에 Java의 강제된 클래스 구조처럼 코드를 구조화하는 방식으로 만든다면 전체적은 효율성을 끌어올릴 수 있다.


Java를 실행하기 위한 소프트웨어 패키지 JRE

JRE(Java Runtime Environment)는 Java 프로그램을 실행하기 위한 소프트웨어 패키지다.

JVM과 Java 클래스 라이브러리를 포함하고 있다.

 

Java 클래스 라이브러리(Java Class Library)는 Java 프로그래밍에서 사용할 수 있는 미리 작성된 코드의 모음이다.

프로그래밍에 유용한 기본적인 기능을 언어 자체에 미리 포함시켜 둔 것이다. 예를 들면 +, - 같은 사칙연산이나 날짜를 확인하거나 기본적인 배열 등을 만들거나 하는 기능 매번 처음부터 구현하려고 한다면 프로그래밍이 너무 복잡하고 어려워 질 것이다. 때문에 이런 기초적인 것들은 언어 엔진 자체에 내장하는 것이다.

  • java.lang
    • String, Math 등 기본 클래스
    • 자동으로 import되는 패키지
    • Object, System 등 핵심 클래스 포함
  • java.util
    • 컬렉션 프레임워크 (ArrayList, HashMap 등)
    • 날짜/시간 관련 클래스
    • Scanner 등 유틸리티 클래스
  • java.io
    • 파일 입출력 관련 클래스
    • 스트림 처리 클래스
  • java.net
    • 네트워크 프로그래밍 관련 클래스
    • URL, Socket 등

자바 개발에 필요한 전체 도구 패키지 JDK 

JDK (Java Development Kit)는 자바 개발에 필요한 전체 도구 패키지다. 간단하게 말하면 이전의 JVM, JRE +@를 모두 포함하는 최상위 개념이다.

 

JDK 주요 개발 도구:

  1. 컴파일러 (javac)
    • Java 소스코드(.java)를 바이트코드(.class)로 변환
    • 문법 검사 수행
  2. 디버거 (jdb)
    • 프로그램 실행 중 오류 추적
    • 코드 분석 도구
  3. 문서 생성기 (javadoc)
    • 소스코드 주석으로부터 HTML 문서 생성
    • API 문서화 도구
  4. JAR 도구 (jar)
    • Java 아카이브 파일 생성/관리
    • 클래스 파일들을 패키징
  5. 기타 도구
    • javap (클래스 파일 역어셈블러)
    • jps (JVM 프로세스 상태 보기)
    • jstat (JVM 통계 모니터링)

구성 요소:

  1. 개발 도구 (위 설명)
  2. JRE (실행 환경)
  3. Java API (클래스 라이브러리)

각각 개념들의 관계

//포함 관계:
JDK (개발 도구 + 실행 환경)
└── JRE (실행 환경)
    └── JVM (실행 엔진)
//실행 흐름:
1. 개발 단계 (JDK 사용)
[.java 소스파일] → [javac 컴파일러] → [.class 바이트코드]

2. 실행 단계 (JRE/JVM 사용)
[.class 바이트코드] → [JVM이 해석] → [프로그램 실행]
//비유하면:
JDK: 전체 주방(요리도구 + 조리시설)
├── JRE: 조리시설(오븐, 가스레인지)
│   └── JVM: 실제로 요리하는 셰프
//실제 사용:
개발자: JDK 필요 (개발 + 실행)
일반 사용자: JRE만 있으면 됨 (실행만)