Class Loader

2023. 5. 17. 16:00High Level Programming Language/Learning the Java Language

Class Loader

클래스 로더는 JVM에서 클래스 파일을 로드하고, 해당 클래스를 메모리에 정의하는 역할을 담당합니다.

자바에서는 클래스 로더(Class Loader)가 클래스당 하나씩 존재합니다.

 

자바에서 클래스 로더(Class Loader)가 클래스당 하나씩 존재하는 이유에는 몇 가지 이유가 있습니다. 이러한 클래스당 하나의 클래스 로더 구조는 자바 언어의 동작 원리와 안정성을 보장하는 데 도움이 됩니다.

  1. 네임스페이스 분리(Namespace Isolation): 각 클래스 로더는 독립된 네임스페이스를 가지고 클래스를 로드합니다. 클래스 로더마다 고유한 클래스 패스를 가지며, 같은 이름의 클래스라도 서로 다른 클래스 로더에 의해 로드될 수 있습니다. 이를 통해 서로 다른 버전의 동일한 클래스가 충돌하지 않고 동시에 실행될 수 있습니다. 네임스페이스 분리는 애플리케이션의 모듈화와 라이브러리의 독립성을 보장하는 데 도움이 됩니다.
  2. 클래스 로딩의 위임(Delegation Model): 클래스 로더는 부모-자식 관계를 형성하여 클래스 로딩을 위임하는 구조를 갖습니다. 클래스 로더는 클래스를 로드하기 전에 먼저 부모 로더에게 로딩을 시도하며, 부모 로더가 해당 클래스를 찾지 못한 경우에만 자신이 로딩을 시도합니다. 이를 통해 클래스의 중복 로딩을 방지하고, 클래스의 의존성 관리와 버전 관리를 용이하게 합니다.
  3. 보안 및 격리(Security and Isolation): 클래스 로더는 보안과 격리에 중요한 역할을 합니다. 서로 다른 클래스 로더가 각각의 네임스페이스를 갖고 있기 때문에, 클래스 로딩 및 실행 시 클래스 간의 상호작용을 제어할 수 있습니다. 특히, 애플리케이션 서버와 같은 환경에서는 클래스 로더를 사용하여 애플리케이션 간의 격리와 보안을 강화할 수 있습니다.
  4. 동적 클래스 로딩(Dynamic Class Loading): 자바는 동적으로 클래스를 로드하고 사용할 수 있는 동적 로딩(Dynamic Loading) 기능을 제공합니다. 클래스당 하나의 클래스 로더 구조를 통해 동적으로 클래스를 로드하고 인스턴스를 생성할 수 있으며, 애플리케이션 실행 중에 필요한 클래스를 동적으로 추가할 수 있습니다. 이를 통해 애플리케이션의 유연성과 확장성을 높일 수 있습니다.

따라서 클래스당 하나의 클래스 로더 구조는 네임스페이스 분리, 클래스 로딩의 위임, 보안 및 격리, 동적 클래스 로딩 등의 이점을 제공하여 자바 언어의 동작 원리와 안정성을 보장하고, 애플리케이션의 모듈화와 확장성을 지원합니다.


각 클래스는 해당 클래스를 로드한 클래스 로더에 의해 정의되고 관리됩니다. 따라서 서로 다른 클래스 로더로 로드된 클래스는 독립적으로 존재하며, 같은 이름의 클래스라도 서로 다른 클래스 로더에 의해 로드된 경우 다른 클래스로 취급됩니다.

 

클래스 로더는 다양한 용도로 사용됩니다. 예를 들어, 동적으로 클래스를 로드하고 인스턴스를 생성하기 위해 Class.forName() 메서드를 사용할 수 있습니다. 클래스 로더는 클래스 패스를 기반으로 클래스 파일을 찾고 로드하므로, 애플리케이션의 클래스 로딩 및 동적 로딩에 중요한 역할을 합니다.

 

따라서 자바 클래스 객체마다 해당 클래스를 로드한 클래스 로더가 별도로 존재하며, 클래스 로더는 클래스의 식별과 로딩을 담당합니다.

 

getClassLoader() 메서드

getClassLoader() 메서드는 자바의 Class 클래스에 정의된 메서드로, 해당 클래스의 클래스 로더(Class Loader)를 반환합니다. 클래스 로더는 자바 가상 머신(JVM)에서 클래스 파일을 로드하고 JVM 내부에서 사용할 수 있게 하는 역할을 합니다.

클래스 로더는 자바 애플리케이션의 실행 환경에서 클래스를 동적으로 로딩하는 데 사용됩니다. 클래스 로더는 클래스 파일을 찾고, 해당 클래스 파일을 메모리에 로드하여 클래스의 정의를 생성하는 역할을 담당합니다. 자바는 여러 개의 클래스 로더를 지원하며, 각각의 클래스 로더는 계층 구조를 형성합니다.

getClassLoader() 메서드는 현재 객체의 클래스 로더를 반환합니다. 이 메서드는 java.lang.Object 클래스에 정의되어 있으므로 모든 객체에서 호출할 수 있습니다. 주로 리플렉션(reflection)과 다이나믹 프록시(dynamic proxy)와 같은 상황에서 클래스 로더를 가져오는 데 사용됩니다


일반적으로 클래스 로더는 다음과 같은 계층 구조를 가집니다:

  • 부트스트랩 클래스 로더(Bootstrap Class Loader): JVM이 시작될 때 기본적인 자바 클래스들을 로드하는 클래스 로더입니다.
  • 확장 클래스 로더(Extension Class Loader): JVM이 시작될 때 JAVA_HOME/jre/lib/ext 디렉토리에 있는 클래스들을 로드하는 클래스 로더입니다.
  • 시스템 클래스 로더(System Class Loader 또는 Application Class Loader): 애플리케이션 클래스패스에 있는 클래스들을 로드하는 클래스 로더입니다.

getClassLoader() 메서드는 해당 객체의 클래스가 로드된 클래스 로더를 반환하며, 클래스 로더의 인스턴스를 가져올 수 있습니다. 클래스 로더를 통해 동적으로 클래스를 로드하거나 클래스의 리소스를 가져올 수 있습니다.