클래스로더

허성재's avatar
Aug 19, 2024
클래스로더

클래스 로더(Class Loader)란 무엇인가?

  • *클래스 로더(Class Loader)**는 자바 런타임 환경에서 클래스를 메모리로 로드하는 책임을 가진 구성 요소입니다. 자바 프로그램이 실행될 때, 자바 가상 머신(JVM)은 프로그램에 필요한 클래스 파일(.class)을 디스크에서 읽어들여 메모리에 올려야 하는데, 이 작업을 수행하는 것이 바로 클래스 로더입니다.

클래스 로더의 역할

  1. 클래스 로딩: 클래스 로더는 자바 클래스 파일을 디스크, 네트워크, 또는 다른 소스에서 읽어들여 메모리에 로드합니다.
  1. 클래스 링크: 로드된 클래스를 JVM 내에서 사용할 수 있도록 링크합니다. 이 단계에서 클래스의 메서드, 필드, 부모 클래스 등이 연결됩니다.
  1. 클래스 초기화: 클래스의 정적 변수와 정적 블록을 초기화합니다.

클래스 로더의 종류

JVM에서 기본적으로 제공하는 클래스 로더에는 몇 가지 주요 종류가 있습니다:
  1. Bootstrap ClassLoader (부트스트랩 클래스 로더):
      • 가장 기본적인 클래스 로더로, JRE의 핵심 클래스(예: java.lang.*, java.util.* 등)를 로드합니다.
      • JVM 자체가 구현하며, Java로 구현되지 않았고, 시스템 의존적입니다.
      • rt.jar 파일에서 클래스를 로드합니다.
  1. Extension ClassLoader (확장 클래스 로더):
      • Bootstrap ClassLoader의 하위 클래스 로더로, JRE 확장 클래스(예: javax.*, org.* 등)를 로드합니다.
      • JRE_HOME/lib/ext 디렉터리나 java.ext.dirs 시스템 속성에서 지정된 경로에 있는 클래스를 로드합니다.
  1. Application ClassLoader (애플리케이션 클래스 로더):
      • Extension ClassLoader의 하위 클래스 로더로, 애플리케이션 클래스(사용자가 작성한 클래스들)를 로드합니다.
      • 기본적으로 클래스패스(classpath)에 지정된 디렉토리와 JAR 파일에서 클래스를 로드합니다.
      • Application ClassLoader는 사용자 정의 클래스를 로드하는 데 사용됩니다.

클래스 로더의 사용 시점

클래스 로더는 다음과 같은 상황에서 사용됩니다:
  • 애플리케이션 시작 시: JVM이 애플리케이션을 실행할 때, 필요한 클래스들을 클래스패스에서 로드합니다.
  • 동적 클래스 로딩 시: Class.forName() 또는 ClassLoader.loadClass() 같은 메서드를 사용해 런타임에 동적으로 클래스를 로드할 때 사용됩니다. 예를 들어, JDBC 드라이버 로딩이나 플러그인 시스템에서 많이 사용됩니다.
  • Custom ClassLoader: 개발자가 사용자 정의 클래스 로더를 만들어 특정 방식으로 클래스를 로드해야 할 때 사용됩니다. 예를 들어, 애플리케이션의 보안 또는 성능 요구 사항에 따라 커스텀 클래스 로더를 구현할 수 있습니다.

클래스 로더의 부모-자식 관계

클래스 로더는 계층 구조를 가집니다. 자식 클래스 로더는 클래스 로드를 요청받으면 먼저 부모 클래스 로더에게 해당 클래스를 로드할 수 있는지 묻습니다. 부모가 클래스를 로드할 수 없을 때만 자식이 직접 클래스를 로드하게 됩니다. 이 구조는 **"부모 위임 모델(Parent Delegation Model)"**이라고 부릅니다.
  • 예를 들어, Application ClassLoader는 클래스를 로드하기 전에 Extension ClassLoader에게 먼저 요청하고, Extension ClassLoaderBootstrap ClassLoader에게 요청합니다.

클래스 로더의 기타 설명

  1. 동일 클래스 문제: 두 개의 서로 다른 클래스 로더가 동일한 이름을 가진 클래스를 로드하면, 같은 클래스여도 서로 다른 클래스로 간주됩니다. 이로 인해 클래스 간의 상호작용이 불가능할 수 있습니다.
  1. 클래스 캐싱: JVM은 클래스를 메모리에 로드한 후, 캐싱하여 성능을 높입니다. 동일한 클래스를 다시 로드할 때는 캐시된 인스턴스를 사용합니다.
  1. 클래스 언로드: 클래스는 가비지 컬렉션에 의해 제거될 수 있지만, 일반적으로 클래스 언로드는 JVM이 종료될 때까지 발생하지 않습니다.
  1. 사용자 정의 클래스 로더: 기본 클래스 로더 외에도, 특정 요구 사항에 맞게 클래스 로더를 커스터마이징하여 사용하는 경우도 있습니다. 예를 들어, 네트워크를 통해 클래스 로드, 암호화된 클래스 파일 로드 등의 요구가 있을 때 사용자 정의 클래스 로더를 만들 수 있습니다.

요약

  • 클래스 로더는 자바에서 클래스 파일을 메모리로 로드하고 초기화하는 JVM의 구성 요소입니다.
  • 기본적으로 Bootstrap ClassLoader, Extension ClassLoader, Application ClassLoader의 세 가지 주요 클래스 로더가 계층 구조로 작동합니다.
  • 클래스 로더는 주로 애플리케이션 시작 시, 동적 클래스 로딩 시, 또는 사용자 정의 클래스 로더가 필요할 때 사용됩니다.
  • 클래스 로더는 부모-자식 관계를 가지며, 부모 위임 모델에 따라 클래스를 로드합니다.
이러한 개념을 이해하면 자바 애플리케이션의 실행 과정과 JVM의 동작 원리를 깊이 있게 이해할 수 있습니다.
Share article

heo-gom