Java에 대하여

벼랑 끝 코딩·2025년 2월 19일
0

Java

목록 보기
1/40

자바를 공부할건데 알고 써야지

오늘날 백엔드 생태계에 큰 부분을 차지한다고 하는 Java.
그리고 백엔드 개발자를 꿈꾸는 내가 이제부터 공부할 언어이기도 하다.
근데 공부 할거면 적어도 뭔지는 대충이라도 알고 공부해야지.

이제부터 한번 알아보자.

자바 표준 스펙

Java를 만들 때 필요한 규칙을 정의한 문서

자바는 프로그래밍 '언어'다.
언어에 규칙이 없다고 생각해보자.

누군가는 인사를 욕으로 해석하고,
누군가는 감탄을 분노로 해석하는 등
대환장 파티가 일어날 것이다.

Java의 규칙, 자바 표준 스펙.

자바 플랫폼

자바 표준 스펙에 따라, 목적에 맞게 구체화한 문서

자바는 프로래밍 '언어'다.
언어는 다양한 목적으로 사용될 수 있다.

친구들과 만날 때 자주 사용하는 말이 있는 반면에
사무적인 환경에서 자주 사용되는 말이 있고,
결혼식, 장례식 등 특정 상황에서만 사용하는 말이 있다.

Java SE(Java Standard Edition)

  • 가장 대중적인 자바 표준 에디션 플랫폼
  • Java 언어라고 하는 대부분의 패키지가 포함된 에디션
  • Java 핵심 기능 제공

Java EE(Java Enterprise Edition)

  • Java SE 확장 버전
  • 웹 프로그래밍에 필요한 기능 다수 포함

Java ME(Java Micro Edition)

  • Java SE 기반
  • 모바일 폰과 같은 작은 가상 머신 동작 기능 제공

Java FX

  • 데스크톱 애플리케이션, 리치 인터넷 애플리케이션 개발 플랫폼

JDK(Java Development Kit)

자바 표준 스펙에 따라 목적에 맞게 구체화한 자바 플랫폼실제 기능

SDK(Software Development Kit)

  • 소프트웨어 개발 도구

자바 표준 스펙, 자바 플랫폼이 규칙과 이러한 기능이 있다는 것을 말로 표현한 문서라면,
JDK는 그것을 구체화한 기능이다.
소프트웨어 개발 도구인 SDK 중 Java에 관련된 것이 JDK.

우리가 다운로드 하는 JDK 17, JDK 21이 바로 이것이다.

JRE(Java Runtime Environment)

Java 언어 실행 환경 제공 소프트웨어

Development Tools

Compiler, Debugger, 문서 생성기 등 개발 지원 도구

JDK가 실제 기능이라면, 실제 기능은
개발을 위한 기능(Development Tools)과,
그것을 실행하기 위한 기능(JRE)으로 나누어진다.

JVM(Java Virtual Machine)

OS에 관계 없이 CPU가 Java를 인식하여 실행 가능하게 하는 가상 컴퓨터

프로그램은 각 운영체제(윈도우, MAC, LINUX 등)에 맞는 명령어로 구성되어 있다.
따라서 윈도우 프로그램은 다른 OS에서 실행할 수 없다.
하지만 Java는 OS에 맞는 자바를 설치하기만 하면,
Java Code 자체는 OS로부터 독립적으로 사용 가능하다.

Java Class Library

Java 프로그램 실행에 필요한 기본 클래스 Library

JRE는 실행 환경 제공 소프트웨어로,
OS에 관계 없이 Java를 실행하기 위한 JVM과
프로그램에 필요한 기본 클래스 라이브러리인 Java Class Library로 구성된다.


핵심은 JVM에 있다.
JVM도 한번 살펴보자.

Class Loader(클래스 로더)

자바 프로그램 실행을 위해 바이트 코드로 이루어진 클래스 파일(.class)을 JVM으로 로딩하는 역할

부트스트랩 클래스로더

  • 운영체제에 맞게 C, C++과 같은 Native로 쓰여진 최상위 클래스 로더
  • 자바 기본 제공 API와 같은 표준 JDK Class 로드(Java.lang.System 등)

확장 클래스로더

  • 부트스트랩 클래스로더가 로드하는 핵심 기능을 제외
  • 보안, XML과 같은 Java 확장 API Class 로드

애플리케이션 클래스로더

개발자가 작성한 .class 확장자 파일 로드

1. Loading

  • 클래스 패스를 통해 필요한 클래스 요청
  • 애플리케이션 클래스로더 → 확장 클래스로더 → 부트스트랩 클래스로더 요청 위임
  • 부트스트랩 클래스 → 확장 클래스로더 → 애플리케이션 클래스로더 순서로 필요한 클래스 동적 로딩, 없다면 위임

2. Linking

(1) Verifying

  • 자바 표준 스펙, 자바 플랫폼, JVM 명세대로 구성되어 있는지 검사

(2) Preparing

  • 검사 후 필요한 메모리 할당
  • Interface, Class, method, field 데이터 구조 준비
  • static field Initialization

(3) Resolving

  • 상수 풀 내 메모리 번지가 아닌 이름에 의해 참조되는 심볼릭 레퍼런스를 실제 메로리 레퍼런스로 교체
  • java.lang.String과 같은 심볼릭 레퍼런스 → String 클래스가 로드된 주소로 변환

3. Initialization

  • static 변수를 명시된 값으로 Initialization

Runtime Data Area(런타임 데이터 영역)

JVM 메모리 영역, 실행에 필요한 데이터 적재

Method(Static) Area(메소드 영역)

JVM 동작부터 프로그램 종료까지 저장한다.

1. 클래스 정보

  • 클래스인지 인터페이스인지
  • Super Class 이름 등

2. 메서드 정보

  • 메서드 이름
  • return Type
  • 매개 변수 등

3. 필드 정보

  • 멤버 변수 이름
  • 데이터 Type 등

4. static 변수

5. 런타임 상수풀

  • 메서드 영역 중 별도 관리 영역
  • 리터럴
  • 객체, 메서드, 필드 참조 값
  • 상수 자료형을 저장, 참조하여 중복 방지

6. 메서드 바이트 코드


Heap Area(힙 영역)

  • 런타임동적으로 할당하여 사용하는 메모리 영역(New 생성 객체), 모든 Thread가 공유한다.


Stack Area(스택 영역)

  • 선입 후출(FILO), Thread Frame과 Thread Frame 내부 Stack Frame으로 구성되며,
    Thread 마다 별도로 생성됨

Stack Frame 구성 요소

  1. 메서드 정보
  2. 지역 변수
  3. 매개 변수
  4. 연산 중 발생하는 임시 데이터
  5. New 객체 참조 값

PC Register

  • JVM Instruction 수행 및 저장
    • 현재 실행중인 JVM 주소
    • 메모리에 전달하기 전 연산 및 결과 값 기억장치

Native Method Stack Area

  • C, C++ 코드 수행 스택
  • Native 메서드 매개 변수, 지역 변수 바이트 코드 저장

Execution Engine(실행 엔진)

클래스 파일 바이트 코드 해석 및 실행

  • Runtime Data Area에 배치된 바이트 코드(.class)를 기계가 실행할 수 있는 형태로 변경

인터프리터(Interpreter)

  • 명령어를 하나씩 읽어서 해석 후 바로 실행
  • 같은 메서드 호출 시 매번 해석하고 실행하여 느린 속도
  • 반복 실행 코드 발견 시 JIT 컴파일러 전달

JIT(Just-In-Time) 컴파일러

  • Interpreter 느린 속도 보완
  • 반복 실행 코드 Native Code 캐싱

Garbage Collector(GC)

  • Runtime Data Area Heap 영역에서 유효하지 않은 객체 삭제
  • Young Generation Eden → Survivor → Old Generation

Young Generation : 생명 주기가 짧은 객체 영역

  1. Eden : new 생성 객체
  2. Survivor : Eden에서 순차적으로 이동

Old Generation : 생명 주기가 긴 객체 영역


Java Native (Method) Interface(JNI)

자바가 아닌 다른 언어로 만들어진 애플리케이션과 상호작용할 수 있는 프로그램으로 Java와 Native 코드 사이 Interface(소통) 역할

Native Method Library(네이티브 메소드 라이브러리)

C, C++로 작성된 라이브러리로, JNI가 Native 코드를 해석하고 자바와 연결하기 위한 도구


정리

너무 많은 지식이 들어왔으니 정리해보자.

우선, Java를 문서로 정의하면 자바 표준 스펙 → 자바 플랫폼

정의한 문서대로 구현한 기능이 바로 SDK 중에서도
JDK(JRE, Development Tools) > JRE(JVM, Java Class Library > JVM(클래스 로더, 런타임 데이터 영역, 실행 엔진, JNI, Native Method Library) 되시겠다.

이제 Java 관련된 용어가 나와도 헷갈리지 말자.
포함 관계와 정의들을 살펴봤으니 말이다.
그럼 얘네들이 어떻게 돌아가는지 그 순서를 알아보자.
예시는 개발의 시작인 Hello World 프로그램이다.

JDK 단계

  1. 개발자가 Hello World를 코딩한다.
    (코딩하면서 사용하는 System.out.println() 등이 바로 JRE Class Library)
  2. HelloWorld.java가 생성된다(사람이 읽을 수 있는 파일).
  3. JDK Development Tools Compiler가 HelloWorld.java → HelloWorld.class로 변환한다(바이트 코드).

JRE 단계

  1. HelloWorld.class 파일 실행을 위한 JVM 인스턴스를 생성한다.

JVM 단계

  1. JVM 클래스 로더가 동작하여 Loading → Linking → Initialization을 수행한다.
  2. Runtime Data Area에 필요한 정보를 적재한다.
  3. 바이트 코드(.class)는 Execution Engine이 수행한다.
  4. Naitve Code는 JNI가 Native Method Library, Native Method Stack Area를 활용하여 처리한다.

굵직한 Java 구성 개념과 실행 순서를 간략하게 이해하고
무지성으로 Java를 쓰기보다 이해하고 사용해보자.

profile
복습에 대한 비판과 지적을 부탁드립니다

0개의 댓글