
-> JVM 이 class 파일을 읽고 스레드가 생성되며 어플리케이션이 실행되며 내부적으로 추가적인 컴파일 과정(JIT 컴파일)을 수행한다 .
JVM 이 바이트 코드를 읽으려면 클래스 로더 가 있어야 한다
🔍그럼 클래스 로더란 뭘까??
:JVM의 일부분으로 동작하는 서브시스템이며 , .class 파일(바이트코드)을 찾아서 JVM의 메모리로 로드하는 역할을 담당한다 .
Bootstrap class loader : 자바의 가장 기본적인 라이브러리를 로드한다 (최상위 계층 클래스 로더 ) ex ) java.util , java.lang
extension class loader : java 의 jar 파일("Java Archive"의 약자로, 여러 클래스 파일과 리소스를 하나로 묶은 압축 파일 형식) 을 로드 한다
Application Class Loader : 개발자 들이 작성한 클래스들을 로드
🔍그럼 클래스 로더는 어떻게 작동 할까?
▶️클래스 로더의 계층별로 다음 3개의 과정이 실행된다
public class ClassLoadingExample {
// 정적 변수 - 초기화 단계에서 값이 설정됨
static int staticCounter = 100;
// 정적 초기화 블록 - 초기화 단계에서 실행됩니다
static {
System.out.println("1. 초기화 단계: 정적 초기화 블록 실행");
System.out.println(" staticCounter = " + staticCounter);
staticCounter = 200;
}
// 인스턴스 변수
private String name;
// 생성자 - 객체 생성 시 호출
public ClassLoadingExample(String name) {
System.out.println("4. 객체 생성: 생성자 실행");
this.name = name;
}
// 메인 메서드 - 클래스 로딩 완료 후 실행
public static void main(String[] args) {
System.out.println("2. 클래스 로딩 완료!");
System.out.println("3. 메인 메서드 실행 시작");
System.out.println(" staticCounter = " + staticCounter);
// 객체 생성
ClassLoadingExample example = new ClassLoadingExample("테스트 객체");
example.printName();
}
public void printName() {
System.out.println("5. 인스턴스 메서드 호출: " + this.name);
}
}
<클래스 로딩 단계>
<실행>
메인 메서드 실행: 클래스 로딩이 완료된 후 main 메서드가 실행
객체 생성: main 메서드 내에서 객체가 생성되고 생성자가 호출됨
메서드 호출: 생성된 객체의 메서드가 호출