해당 게시물은 개인 공부 기록용입니다. 아래 링크들을 보시는게 더 좋습니다!
참고문서
1. 자바 파일과 클래스 파일의 관계: https://droptable.tistory.com/42
2. [조금 더 깊은 java] Java Bytecode를 알아보자 : https://wonit.tistory.com/589
3. JVM 구조와 JAVA의 동작 원리: https://velog.io/@sgwon1996/JAVA%EC%9D%98-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC%EC%99%80-JVM-%EA%B5%AC%EC%A1%B0
4. 인터프리터 vs 컴파일러: https://modulabs.co.kr/blog/interpreter-and-compiler/

출처[https://docs.oracle.com/javase/8/docs/]
.class 파일이란?
.class 파일은 .java파일을 컴파일해서 생성된다.
.class 파일은 컴파일러에 의해 생성된 java bytecode로 구성된 파일이다.
자바 클래스 파일의 큰 특징은 JVM을 위한 코드를 생성한다는 것이다.
즉 특정 컴퓨터를 위한 코드를 바로 생성하지않고 JVM을 위한 bytecode를 생성한다.
.java -> 컴파일러가 컴파일(JVM이 이해할 수 있도록 Bytecode로 변환) -> .class 파일 -> JVM이 기계어로 해석(운영체제에 맞게)
인터프리터 언어와 컴파일러 언어
인터프리터 언어는 프로그램을 한 줄씩 읽어 들이면서 즉시 실행하는 방식이다.
인터프리터는 소스 코드를 직접 해석하고 실행해서 컴파일 과정이 필요하지않다.
대표언어로 python, JS등이 있다.
단점은 실행속도가 상대적으로 느리다.
컴파일러 언어는 소스 코드를 기계어로 번역하는 컴파일 과정이다.
소스 코드 전체를 분석하고 최적화 한뒤 실행파일을 생성한다.
대표적으로 C,C++,Java등이 있다.
JIT 컴파일
인터프리터 언어의 실행 속도를 개선하기 위한 기술
프로그램 실행 중에 자주 사용되는 코드를 기계어로 컴파일하여 성능을 개선한다.
빠른 개발과 유연성이 중요하다면 인터프리터 언어를 실행 속도와 안정성이 중요하다면 컴파일러 언어를 선택하자
Java Bytecode
기계어? 바이트코드?
기계어는 CPU가 직접 실행할 수 있는 코드로 CPU와 운영체제에 종속적
바이트코드는 기계어 이전 단계의 중간 코드(자바, 파이썬등에서 컴파일된 코드)
javac는 "java 소스 코드를 바이트 코드로 컴파일", JVM은 이 "바이트 코드를 인터프리터와 JIT 컴파일러를 사용해 운영체제에 맞는 기계어로 변환하고 실행"
JAVA 컴파일러? JIT 컴파일? -> JAVA 컴파일러 JAVAC를 통해 "바이트코드로", JVM에서 기계어로 번역