(1) 자바의 프로그램 기본적인 동작 과정
[1] 소스 코드 작성 -> .java 소스 파일 생성
[2] 자바 컴파일러를 통해 .java 소스 파일을 .class(바이트 코드) 파일로 변환
[3] JVM을 통해 .class 파일을 기계어로 변환 -> 기계어는 운영체제를 통해 실행
[4] 결과적으로 운영체제가 프로그램을 실행함.
* 바이트코드 : 자바 컴파일러를 통해 JVM이 읽을 수 있도록 번역을 해놓은 코드를 바이트코드라고 한다.
(2) 자바 컴파일러
- 사용자가 직접 작성한 .java 소스코드를 JVM 이 읽을 수 있도록 바이트코드로 번역을 해주는 프로그램이다.
- 컴파일 과정에서 구문 분석, 타입 검사, 최적화, 바이트 코드 생성을 해준다.
(3) JVM(Java Virtual Machine)
- 자바 바이트코드(.class)를 읽어서 운영체제나 CPU에 맞게 기계어로 변환하고 실행해주는 가상 머신이다.
- 결국 컴퓨터는 0과 1인 기계어 밖에 못 읽기 때문에 그에 맞게 기계어로 번역을 해주는 프로그램이다.
- 운영체제로 부터 공간을 할당 받으면, JVM은 해당 공간을 자체적으로 정의해서 사용을 하게 된다.
- 이때 JVM이 해당 공간을 나눠서 이용을 하는데, 대표적으로 메서드, 힙, 스택 영역 등으로 나누어진다.
[1] JVM의 주요 역할
- 클래스 로더 : .class 바이트 코드를 메모리에 올려주는 역할을 함.
- 바이트코드 실행기 : 바이트코드를 해석해서 JIT 컴파일해서 실행을 해줌.
- 메모리 관리 : 힙 / 스택 관리 + 가비지 컬렉션(자동 메모리 정리) 역할을 해줌.
- 쉽게말해, OS에서 JVM에게 메모리를 할당 JVM은 그 안에서 힙/스택 등의 영역을 만들어서 이용함.
- 결론은, 메모리 공간에서 Java 프로그램이 실행이 되는 것이다.
(4) 왜 JVM이 .java 소스 코드를 직접 실행하도록 안 만든 걸까?
- 자바 컴파일러는 구문 분석, 타입 검사, 최적화 등 다양한 작업을 하기 때문에 오래걸릴 수 있음.
- .class 바이트 코드는 이미 정리된 코드이기 때문에 컴파일 이후 JVM 실행이 오히려 속도 측면에서 유리함.
- 컴파일러와 JVM을 나누게 되면 다른 언어도 JVM 위에서 실행이 가능하다는 큰 장점이 있음.
- 언어에서 .class로 변환만 해주면 결국 다양한 언어를 만들 수 있다는 의미이다.
(5) 결론
- 자바의 내부 동작에 대한 내용을 담았지만, 이해를 돕고자 표면적인 내용일 뿐 더 깊은 내용이 있다.
- JVM과 자바 컴파일러 두 개를 쓰는 건 비효율 같지만 다 이유가 있다 이말이다..
- 큰 틀을 잡았기 때문에 JVM 내부의 동작을 살펴보면 이해가 더욱 쉬울 것 이다.
'공부 > ☕Java' 카테고리의 다른 글
| [Java] 추상화 - 추상클래스, 추상메서드, 인터페이스 (0) | 2025.05.20 |
|---|---|
| [Java] Enum 쉽게 이해하기 (1) | 2025.05.05 |
| [Java] Java와 객체지향 프로그래밍이란? (0) | 2025.03.06 |
| [Java Design Pattern] 정적 팩토리 메서드 (0) | 2024.11.10 |
| [Java] 변수 초기화에 대한 이해 (2) | 2024.11.05 |