Java에 대하여

JJinu·2026년 1월 19일

JAVA

목록 보기
2/3
post-thumbnail

오늘은 면접을 보고 왔지만 기초가 부족하다는걸 느껴 작성하게 되었습니다.
(Like 말하는 감자.. 아무래도 답변을 잘 못해서 떨어졌겠지만 다음엔 딴딴하게 간다!) 😭

Java란 어떤 언어인가?

내가 알기로는 자바는 컴파일과 인터프리터의 특성을 모두 가진 하이브리드 언어로 알고 있는데, 맞을까?

일단, Java는 컴파일과 인터프리터를 모두 사용하는 하이브리드 언어가 맞다!

Java의 실행 과정

  1. 컴파일 단계: .java 소스코드 → .class 바이트코드 (javac 컴파일러)
  2. 클래스 로더: 바이트코드 → 메모리 영역 로딩
  3. 인터프리터/JIT 단계: 바이트코드 → 기계어 (JVM이 실행)

EX) Hello.java → javac → Hello.class → JVM → 실행

Java는 컴파일 단계에서 바이트코드로 변환하고 JVM이 바이트코드를 기계어로 변환하는 실행과정을 거치기에 하이브리드 언어라고 할 수 있다고 합니다..!

﹖ 근데 컴파일 언어 하면 Java가 떠오르고 인터프리터 언어 하면 Python이 떠오르는데 뭐가 어째 된겁니까?!

(사실 여기서 제가 잘 모른다는걸 느꼈습니다.
'자바가 인터프리터의 역할을 수행한다고요?'라는 질문을 받았을 때 답변에 확.신을 가지지 못한거죠 ㅠㅠ)

그래서 바로 GPT와 토론을 해보았죠.

Q. 왜 대중적으로 Java는 컴파일언어 / Python은 인터프리터 언어라고 할까? 사실은 하이브리드 언어라는데
A. "Java는 컴파일 언어, Python은 인터프리터 언어다!" 이렇게 알고 계신 분들 많으시죠? 저도 처음엔 그렇게 배웠어요. (핳 지선생님도 이렇게 알고 있었데요. 나만 이상한거 아녔어)

일단 두괄식으로 갑시다. 결론으로는 Java, Python 모두 하이브리드 언어 라는것!

💡 왜 "Java = 컴파일 언어"로 알려졌을까?

# 1. 컴파일 (명시적으로 해야 함)
javac Hello.java

# 2. 실행
java Hello

이처럼 Java는 컴파일 하는 과정이 눈으로 명시적으로 보이고, Hello.class 파일도 직접 생성되니까 컴파일 언어처럼 느껴지니 대중적으로 컴파일 언어이다라고 생각이 드는거였습니다.

💡 그럼 Python은?

python hello.py

파이썬은 CLI에서 이렇게 실행하죠? 하지만, 내부적으로는 컴파일이 자동으로 일어나서 사용자는 의식하지 못합니다. 그래서 인터프리터 언어처럼 느껴지는것이고 사실 Python도 __pycache__ 폴더에 .pyc 바이트코드를 만들기 때문에 하이브리드 언어라는 것이죠!

실행 과정 : 소스코드 → 바이트코드로 컴파일 → 가상머신이 실행 (하이브리드)

차이점:
Java: 컴파일이 눈에 보임 (javac 명령 필요, .class 파일 생성)
Python: 컴파일이 자동/숨겨짐 (한 번에 실행, .pyc는 뒤에서 생성)

결론:
둘 다 같은 방식인데, 사용자 경험이 달라서 Java는 "컴파일 언어",
Python은 "인터프리터 언어"처럼 느껴진다!


다음! 일단 저희의 큰 주제가 Java죠?? Java에 대해서 좀 더 가봅시다!

1. JVM이 뭐야??

Java 프로그램을 실행시키는 가상 머신으로, 자바 소스 코드를 컴파일하여 생성된 바이트코드(.class 파일)를 운영체제(OS) 환경에 맞게 해석하고 실행하는 역할을 수행합니다.

이를 한번 게임기에 비유해볼까요?

다들 닌텐도 아시죠? (저도 포켓몬이랑 리듬세상 엄청했었는데..) 닌텐도를 즐기려면 기기말구 전용 카트리지가 꼭 필요해요!
게임 카트리지(바이트코드)를 게임기(JVM)에 꽂으면 → 화면에 게임(프로그램)이 실행되는 것처럼! 바이트코드는 JVM만 있으면 어디서든 실행 가능합니다.

🤔 왜 JVM이 필요할까?
JVM 없이 프로그램을 실행한다면?

Windows용 프로그램.exe  → ❌ Mac에서 실행 안 됨
Mac용 프로그램.app      → ❌ Linux에서 실행 안 됨
운영체제마다 따로따로 만들어야 해요. 😭

JVM을 사용하면?

Hello.class (바이트코드)
    ↓
Windows JVM → ✅ Windows에서 실행
Mac JVM     → ✅ Mac에서 실행  
Linux JVM   → ✅ Linux에서 실행
한 번 작성하면 어디서든 실행! (Write Once, Run Anywhere)

이게 바로 JVM의 힘입니다! 근데 이거말고 JVM은 메모리 관리까지 같이 해줍니다!


JVM 내부 구조

JVM은 3개 영역으로 구성 되어 있습니다.

Class Loader → 메모리 영역 → 실행 엔진
   (로딩)        (저장)       (실행)

Q. 각각 뭐 하는 건데?

📁 Class Loader

  • .class 파일을 메모리로 불러오는 역할

💾 메모리 영역 (Runtime Data Area)

공유 영역 (모든 스레드가 함께 사용, GC 대상)

  • Method Area: 클래스 정보, static 변수 저장
  • Heap: 객체(new로 생성한 것)가 저장되는 곳

스레드별 개별 영역

  • Stack: 메서드 호출 시 지역변수, 매개변수 저장 (메서드 끝나면 자동 삭제)
  • PC Register: 현재 실행 중인 명령어 위치 기록
  • Native Method Stack: C/C++ 같은 네이티브 코드 실행 정보 저장

⚙️ 실행 엔진

바이트코드를 기계어로 변환하고 실행합니다.

  • 인터프리터: 바이트코드를 한 줄씩 해석해서 실행
  • JIT 컴파일러: 자주 쓰는 코드를 미리 기계어로 변환해서 캐시에 저장 → 성능 향상!

JIT 컴파일러 = 실행 중에 코드를 최적화하는 컴파일러

Q. JIT는 뭘 해주는데?
1. 자주 실행되는 코드 발견 👀
2. 기계어로 미리 변환해서 캐시에 저장 💾
3. 다음번엔 캐시에서 바로 꺼내 씀 ⚡
A. 반복되는 코드 실행 속도가 엄청 빨라짐!

📌 이제 이렇게 답변해봅시다!

Q. Java는 컴파일 언어인가요, 인터프리터 언어인가요?
A. Java는 두 가지 방식을 모두 사용하는 하이브리드 언어입니다.
소스코드를 javac로 바이트코드로 컴파일한 후, JVM이 인터프리터와 JIT 컴파일러를 통해 
실행합니다.
Q. JVM이 뭔가요?
A. JVM은 자바 바이트코드를 실행하는 가상 머신으로, 
운영체제에 독립적으로 Java 프로그램을 실행할 수 있게 해주며,
메모리 관리(GC)도 자동으로 처리합니다.
Q. JIT 컴파일러가 뭔가요?
A. 런타임 중에 자주 실행되는 코드를 기계어로 미리 컴파일해서 캐싱하는 기술로, 
Java의 실행 속도를 크게 향상시킵니다.

마무리

자바는 객체지향 언어라는거 다들 알고 계시져? 다음에는 객체지향이 무엇인지와 클래스, 추상클래스, 인터페이스란 무엇인지에 대해 포스팅을 작성하고자 합니다.

끝까지 읽어주신 분들께 감사드리며 오늘도 행복한 하루 되셨으면 좋겠습니다!

profile
하루하루 의미있고 행복하게! (Yesterday is History, Tomorrow is a mystery, But today is a gift)

0개의 댓글