프로그래밍 언어/자바(Java)

Java 프로그래밍 02 : 프로그램의 실행 구조

플로리페르 2025. 4. 3. 22:50

이번 포스트에서는 Java 프로그램의 실행 구조에 대해 다뤄볼 예정이다. Java는 C와 C++과 마찬가지로 컴파일러를 사용하여 소스 코드(고급 언어)를 저급 언어(기계어)로 바꿔주는 과정을 거친다. (참고로 Python, JavaScript는 컴파일러가 아닌 인터프리터를 사용한다.)

 

컴파일러 vs 인터프리터

  컴파일러 인터프리터
번역 방식 한 번에 전체 번역 한 줄씩 번역
실행 속도 빠름 (기계어로 변환된 상태) 느림 (실행할 때마다 번역)
오류 발견 컴파일 시 오류 발견 실행 중 오류 발견
코드 변경 시 다시 컴파일해야 실행 가능 즉시 실행 가능
언어 C, C++, Java(바이트코드) Python, JavaScript

 

 

 

그런데, 자바에서 사용하는 컴파일러는 JVM이 있어 C 계열과는 동작 과정이 조금 다르다.

 

 


 

 

Java 컴파일러와 JVM

 

컴파일러와 JVM 동작 과정

 

1. 컴파일러가 Java 소스를 바이트 코드로 변환한다.

코드를 저장하는 순간 자동으로 .java 파일이 컴파일 되며 .class 파일로 변환된다.

 

2. JVM이 바이트 코드 파일을 구동하여 기계어로 변환한다.

 

3. 기계어로 바뀐 프로그램은 PC에서 실행이 가능하다. 이것을 LINK 되었다고 표현한다.

 

* LINK : 메모리 로딩, 실행 준비, 실행 결정, 초기화를 모두 일컫는 말.

 

 

여기에서 재밌는 점은 2번이다. 자바는 특성상 운영체제에 구애받지 않고 JVM 위에서 실행된다. 따라서 컴파일러가 Java 소스를 변환한 바이트 코드 파일은 엄밀히 말하자면 기계어가 아니라, JVM이 실행할 수 있는 .class 파일이다.

그렇다면 JVM은 이 바이트 코드 파일을 어떻게 구동하는 걸까? 

 

JVM 구동 과정 : What is JVM in Java ❘ JVM Architecture (Scientech Easy)

 

 

위 그림은 JVM 아키텍처이다. 

 

세부 동작 원리는 넘어가면, 여기에서 눈에 띄는 점은 Interpreter(인터프리터)다. 인터프리터는 컴파일러와 달리 코드를 한 줄씩 번역해서 실행하는 방식을 의미한다.

 

즉, 자바는 컴파일러(javac.exe)가 바이트 코드(.class)로 변환한 것을 JVM이 인터프리터 방식으로 실행하여 기계어로 변환한다는 것을 알 수 있다.

 

기존에는 자바 역시 컴파일 언어라고만 생각했는데 내부적으로 인터프리터가 있는 혼합형 모델이라는 점이 새로웠다. (Java를 처음 접한 게 18년도였는데 25년이 되어야 처음 알았다 ㅎ)

 

 

JVM의 다른 부분 동작 원리는 아래 포스트에서 정리를 잘 해주셔서 참고하면 좋을 것 같다.

https://adjh54.tistory.com/279

 

[Java] JVM(Java Virtual Machine) 이해하기 -1 : 동작 과정

해당 글에서는 Java Application 환경에서 Java 소스코드가 JVM 내에서 수행되는 전반적인 과정에 대해서 확인해 봅니다. 1) JVM(Java Virtual Machine)💡 JVM(Java Virtual Machine) - 자바 프로그램을 실행하기 위한

adjh54.tistory.com

 


 

 

가비지 컬렉터 (Garbage Collector)

 

C계열 프로그램과 달리 Java 프로그램은 프로그램 실행에 필요한 메모리를 Garbage Collector(GC)가 자동으로 관리한다.

 

C계열 프로그램 Java 프로그램
개발자가 직접 메모리를 관리한다.
만약 메모리 관리를 잘못할 경우, 메모리 누수가 발생하고
타 프로그램 동작이 멈출 수 있음
개발자가 메모리에 접근할 수 없다.
따라서 개발자는 메모리를 관리할 수 없고,
가비지 컬렉터가 불필요한 메모리를 회수해서
메모리를 최적화 한다.