Topic
Java
JDK
JRE
JVM
What I Learned
Java
정의
Sun Microsystems에서 1995년에 제임스 고슬링과 연구원들이 개발한 객체지향 프로그래밍 언어이자 플랫폼 독립적인(Write Once, Run Anywhere) 특징을 가진 언어 및 개발 환경
특징
- 한 번 작성하면 여러 플랫폼에서 실행 가능한 WORA(Write Once, Run Anywhere) 특성
- JVM(Java Virtual Machine)을 통해 플랫폼 독립성과 보안성을 제공
- 웹, 모바일, 서버 등 멀티 플랫폼 프로그래밍이 가능
- 객체 지향 설계 및 프로그래밍 활용 언어
- 플랫폼에 독립적이어서 높은 이식성
- 인터프리터와 컴파일러의 장점을 모두 갖춘 언어
- 자동 메모리 관리와 예외 처리 기능 내장
- 동적 로딩과 멀티스레딩 구현이 쉽고 효율적
- 병행성(Concurrency)을 지원하는 다양한 기능 내장
- 풍부한 오픈 소스 라이브러리와 프레임워크 지원
- 보안과 신뢰성 측면에서 매우 강력
- 기업용 애플리케이션 개발에 널리 활용되고 검증된 언어
- 강한 형식 검사와 풍부한 API 제공으로 안정성 확보
- 네트워크 프로그래밍에 적합하며 서버 사이드 애플리케이션에 강점
역사
- Java 1.0 (1996) 최초 릴리즈, JVM 도입, AWT GUI, Applet 지원
- Java 5 (2004) Generics, Enum, Annotation, Enhanced for-loop
- Java 6 (2006) Scripting API, JDBC 4.0, Web Services 강화, 한국 Legacy Standard 버전 1
- Java 8 (2014) LTS, Lambda, Stream API, Optional, 날짜 API 개선, 한국 Legacy Standard 버전 2(마지막 무료 Oracle JDK), 가장 유의미한 문법 변화
- Java 11 (2018) LTS, var 지원, HttpClient, 문자열 API 강화, Open JDK 활용 시작
- Java 17 (2021) LTS, Sealed Class, Pattern Matching, 성능 개선 필드에서 선호
- Java 21 (2023) LTS, Virtual Thread, Record Pattern, String Template

JDK (Java Development Kit)
- 자바 개발을 위한 전체 패키지
- 구성 요소:
- JRE (실행 환경)
- JVM (가상 머신)
- 개발 도구 (javac, javadoc, jar, 디버거 등)
- 문서, 샘플 코드
- 즉, 개발자는 JDK를 설치해야 하고, 단순 실행만 필요하면 JRE만으로 충분했습니다.
- 최근(자바 11 이후): JRE는 별도로 배포하지 않고, JDK만 제공됩니다
Java SE, Standard Edition: 기본적인 Java 기능 제공 (일반 사용자)
- 가장 기본적인 자바 플랫폼
- 기능: 언어 문법, 기본 API(java.lang, java.util, java.io 등), JDBC, 네트워킹, GUI(Swing, JavaFX 일부)
Java EE → Jakarta EE (Enterprise Edition)
- 현재는 Jakarta EE라는 이름으로 Eclipse 재단에서 관리됩니다.
- 특징:
- 대규모 기업 애플리케이션 개발에 특화
- 웹 애플리케이션 서버 (Tomcat, WildFly, GlassFish, Payara 등)
- 서블릿, JSP, EJB, JPA, JMS, JAX-RS 같은 사양 포함
- 분산 처리, 트랜잭션 관리, 웹 서비스 API 지원
Java ME (Micro Edition)
- 자원이 제한된 환경(휴대폰, IoT 기기, 임베디드 장비)을 위한 경량 자바 플랫폼
- 2000년대 초·중반에는 피처폰 앱 개발 등에 많이 쓰였으나,
지금은 안드로이드와 IoT 플랫폼 등장으로 사실상 사용되지 않습니다.
JRE (Java Runtime Environment)
- JVM + 실행에 필요한 기본 클래스 라이브러리
- 개발 도구는 포함되지 않음
- Java 11 이후부터는 JDK만 배포되고, JRE는 따로 제공되지 않음
JVM
정의
자바 바이트코드를 운영체제에 맞게 해석하고 실행하는 가상 머신 프로그램

실행 단계

메모리 구조
- Method Area: 클래스 별로 필드 데이터, 메소드 데이터, 메소드 코드, 생성자 코드, 런타임 상수 풀 등을 저장하는 영역으로 모든 스레드가 공유
- Heap Area: 객체와 인스턴스 변수가 저장되는 영역. GC의 관리 대상
- Stack Area: 각 스레드마다 생성되며 메소드 호출 시 생성되는 프레임(stack frame)과 지역 변수, 매개변수 등이 저장되는 영역
- PC(Program Counter) Register: 각 스레드마다 존재하며 현재 실행 중인 명령어의 주소를 저장하는 영역
- Native Method Stack: C/C++ 등 네이티브 메소드를 실행할 때 필요한 정보를 저장하는 영역

JIT Compiler
- JVM이 바이트코드를 실행할 때 사용하는 동적 컴파일 기술
- 자주 실행되는 코드를 실행 중에 기계어로 변환하여 최적화
- 인터프리터 언어의 단점을 어느정도 극복
- Java 코드 실행 프로세스
- 인터프리터로 바이트코드를 한 줄씩 실행
- 반복적으로 실행되는 코드가 감지되면 JIT Compiler가 해당 코드를 기계어로 변환
- 이후 해당 코드는 변환된 기계어로 바로 실행
Garbage Collection
- 프로그램 실행 중 참조가 없는 객체를 자동으로 탐지하고 메모리에서 제거하는 메모리 관리 기법
- Mark and sweep 알고리즘을 사용
Java 환경 - Eclipse Temurin
- OpenJDK 기반의 오픈소스 Java SE 빌드
- 다양한 OS 플랫폼(Linux=Unix, Mac, Window, Solaris)과 Java SE 버전에 대해 제공되며 프로덕션 환경에서 사용하기에 권장되는 최신 릴리스를 제공합니다.
- 해당 릴리스는 Adoptium 커뮤니티에 의해 정기적으로 업데이트되고 지원되며 마이그레이션 지원, 컨테이너 이미지, 패키지 설치 가이드 등도 제공된다.
Java 개발 도구 - IntelliJ IDEA
- JetBrains에서 개발한 Java IDE(Integrated Development Environment)으로, 강력한 코드 자동완성, 디버깅, 리팩토링 기능을 제공하는 도구
To study
- JVM의 구조, 메모리 구조와 실행 단계
- Java의 컴파일 언어, 인터프리터 언어적 특성
- 가비지 컬렉션
Reference