Java

클래스 로딩

AlbertIm 2024. 12. 5. 14:41

시작

기반이 탄탄한 자바 개발자로 성장하기 위해선 클래스 로딩에 대한 이해가 필요하다고 생각합니다. 클래스 로딩은 자바의 핵심 중 하나이며, 자바의 가장 기본적인 동작 원리 중 하나입니다. 클래스 로딩에 대해 알아보겠습니다.

본문

클래스 로딩이란?

클래스 로딩은 자바 가상 머신이 클래스 파일을 읽어와서 메모리에 올리는 과정을 말합니다. 클래스 로딩은 두 단계로 이루어져 있습니다. 로딩 -> 링크입니다.

로딩

로딩은 클래스 파일을 구성하는 바이트의 데이터 스트림을 가져오는 과정입니다. 클래스 로더는 클래스 파일을 읽어와서 바이트 코드를 메모리에 저장합니다. 이때 클래스 로더는 클래스 파일을 찾는 경로를 지정해야 합니다.

링크

링크는 로딩된 클래스 파일을 실행 가능한 형태로 연결하는 과정입니다. 링크는 세 단계로 이루어져 있습니다. 검증 -> 준비 -> 해결 -> 초기화입니다.

  • 검증: 클래스 파일이 올바른지 검사합니다.
    • 수행되는 몇 가지 주여 검사는 다음과 같습니다.
      • 바이트코드가 허용되지 않거나 악의적인 방법으로 스택을 조작하는지 검사합니다.
      • 모든 분기 명령어에 적절한 대상 명령어가 있는지 검사합니다.
      • 메서드가 올바른 정적 유형의 매개변수 수로 호출되는지 검사합니다.
      • 로컬 변수에 적절한 타입의 값만 할당됐는지 검사합니다.
      • 던질 수 있는 예외가 적절한 캐치 핸들러가 있는지 검사합니다.
  • 준비: 클래스의 정적 변수를 할당하고 적절한 기본값으로 초기화합니다.
  • 해결: 링킹 할 클래스의 상위 클래스 및 인터페이스에 대한 참조를 해결합니다. 이때 상위 클래스나 인터페이스가 로드되지 않았다면 로드합니다.
  • 초기화: 클래스 변수를 초기화하고 정적 블록을 실행합니다.

Class 객체

클래스 로딩이 완료되면 JVM은 클래스의 정보를 담고 있는 Class 객체를 생성합니다.

Class 객체에는 Method, Field 그리고 클래스의 멤버에 해당하는 다양한 다른 객체에 대한 참조가 포함되어 있습니다. 이 객체를 통해 클래스의 정보를 얻을 수 있습니다.

클래스 로더

클래스 로더는 ClassLoader 클래스를 상속받아 구현한 자바의 클래스입니다. 클래스 로더는 클래스 파일을 읽어와서 메모리에 올리는 역할을 합니다. 클래스 로더는 세 가지로 구분됩니다.

  • Bootstrap Class Loader: JVM이 시작할 때 가장 먼저 클래스를 로드하는 클래스 로더입니다. JVM 자체의 일부라고 볼 수 있습니다.
  • Platform Class Loader: Bootstrap Class Loader된 후 앨프리케이션이 의존하는 나머지 플랫폼 라이브러리를 로드하는 클래스 로더입니다.
  • Application Class Loader: 애플리케이션 클래스 로더는 애플리케이션 클래스패스에 있는 클래스를 로드하는 클래스 로더입니다.

예시 코드를 통해 클래스 로딩에 대해 알아보겠습니다.

    public static void main(String[] args) {
        // day를 랜덤으로 설정
        var clThis = DayOfWeek.class.getClassLoader();
        System.out.println("clThis ClassLoader: " + clThis);

        var clObject = Object.class.getClassLoader();
        System.out.println("clObject ClassLoader: " + clObject);

        var clRandom = HttpClient.class.getClassLoader();
        System.out.println("clRandom ClassLoader: " + clRandom);
    }

    public enum DayOfWeek {
        MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
    }

 

위 코드를 실행하면 다음과 같은 결과가 나옵니다.

clThis ClassLoader: jdk.internal.loader.ClassLoaders$AppClassLoader@251a69d7
clObject ClassLoader: null
clRandom ClassLoader: jdk.internal.loader.ClassLoaders$PlatformClassLoader@24d46ca6
  • DayOfWeek 클래스는 애플리케이션 클래스 로더에 의해 로드되었습니다.
  • Object 클래스는 부트스트랩 클래스 로더에 의해 로드되는데 보안상의 이유로 클래스 로더가 null로 표시됩니다.
  • HttpClient 클래스는 플랫폼 클래스 로더에 의해 로드되었습니다.

마무리

클래스 로딩은 자바의 핵심 중 하나이며 자바의 가장 기본적인 동작 원리 중 하나입니다. 클래스 로딩에 대해 알아보았으며 클래스 로더에 대해 알아보았습니다.

참고