.java/.class

sh·2025년 3월 25일

.java
프로그래밍 언어로 작성된 소스 코드, 고급 언어, 사람에게 친숙한 문법

.class
바이트 코드, 기계어와 고급 언어 사이의 중간 코드
jvm에서는 .java 파일이 javac(컴파일러)에 의해 변환된 꼴

.class는 기계가 읽을 수 있나?
기계어가 아님, 바로 읽지 않음
jvm내의 Interpreter 혹은 JIT(Just-In-Time) 컴파일러에 의해 기계어로 바뀌고 읽힘

왜 굳이 .class로 중간 변환을 거치나?
1. 플랫폼 독립성
기계어는 CPU 아키텍처(예: x86, ARM)에 따라 다르지만, 바이트코드는 어떤 OS라도 실행시킬 수 있다.
2. 유연한 실행 환경 지원
GC, 동적 최적화, 멀티 스레딩 등으로 jvm이 제공하는 최적화를 제공받고 복잡한 시스템 의존성을 낮춤
3. 보안성 강화
jvm이 Verification후 실행 하므로, 메모리 보호 네트워크 보안 정책 등으로 악성 코드 실행 방지

정말 바로 기계어로 바꾸면 이 동작들이 불가능한가?
1. 기계어는 CPU 아키텍처에 종속적이다. 바이트 코드와 달리
2. 기계어로 바로 변환된 코드에서는 하드웨어에 최적화된 명령어 사용이 어렵다. 또한 스택 트레이스나 로그를 통한 디버깅이 어렵고, 기계어 자체도 동적 최적화를 수행할 유연성을 제공하지 못한다.
3. 기계어에 바로 적용이 가능하겠지만, 일관된 보안 정책을 적용해야 함에도 종속되는 모든 OS를 고려해야 한다. 또한, jvm이 변환 과정을 한번 더 거치므로 리버스 엔지니어링 난이도가 높아진다.

profile
CS 기록

0개의 댓글