자바 클래스로더

자바 클래스로더(Java Classloader)는 자바 클래스자바 가상 머신(JVM)으로 동적 로드하는 자바 런타임 환경(JRE)의 일부이다.[1] 일반적으로 클래스들은 요청 시 한 차례만 로드된다. 자바 런타임 시스템은 클래스로더 때문에 파일과 파일 시스템에 대해 알 필요가 없다. 위임(delegation)은 클래스로더에 대해 학습할 때 이해하는데 중요한 개념이다.

소프트웨어 라이브러리는 관련 오브젝트 코드의 모임이다. 자바 언어에서 라이브러리들은 JAR 파일로 묶여있는 것이 보통이다. 라이브러리들은 여러 종류의 오브젝트들을 포함할 수 있다. Jar 파일에 포함된 가장 중요한 형식의 오브젝트는 자바 클래스이다. 클래스는 코드의 명명 단위로 간주할 수 있다. 클래스 로더는 라이브러리를 위치시키고 내용물을 읽으며 라이브러리들 안에 포함된 클래스들을 읽는 역할을 한다. 로딩은 일반적으로 요청이 오면 이루어지는데, 이 말은 클래스가 프로그램에 의해 호출될 때까지 로드하지 않는다는 것을 뜻한다. 명명된 클래스는 주어진 클래스로더에 의해 한 번만 로드될 수 있다.

각 자바 클래스는 클래스 로더에 의해 로드되어야 한다.[2] 게다가 자바 프로그램들은 외부 라이브러리들을 이용하거나 최소한 수많은 라이브러리들의 한 부분으로 구성될 수 있다.

JVM이 시작되면 3개의 클래스 로더들이 사용된다:[3][4]

  1. 부트스트랩 클래스 로더
  2. 확장 클래스 로더
  3. 시스템 클래스 로더

부트스트랩 클래스 로더는 <JAVA_HOME>/jre/lib 디렉터리에 위치한 핵심 자바 라이브러리들을 불러들인다.[5] 핵심 JVM의 일부분인 이 클래스 로더는 네이티브 코드로 작성되어 있다.

확장 클래스 로더는 확장 디렉터리(<JAVA_HOME>/jre/lib/ext[6] 또는 java.ext.dirs 시스템 속성에 지정된 기타 디렉터리)에 코드를 로드한다. sun.misc.Launcher$ExtClassLoader 클래스에 의해 구현되어 있다.

java.class.path에서 볼 수 있는 시스템 클래스 로더는 CLASSPATH 환경 변수에 매핑된다. sun.misc.Launcher$AppClassLoader 클래스에 의해 구현되어 있다.

사용자 지정 클래스 로더 편집

자바 클래스 로더는 자바로 작성된다. 그러므로 자바 가상 머신의 세세한 부분을 이해하지 않아도 자신만의 클래스 로더를 작성하는 것이 가능하다. 모든 자바 클래스 로더는 부모 클래스 로더가 있으며, 부모 클래스 로더는 새로운 클래스 로더가 인스턴스화되거나 가상 머신의 시스템 기본 클래스 로더로 설정된다.

같이 보기 편집

각주 편집

  1. Mcmanis, Chuck (1996년 10월 1일). “The basics of Java class loaders”. JavaWorld. 2008년 1월 20일에 원본 문서에서 보존된 문서. 2008년 1월 26일에 확인함. 
  2. Christudas, Binildas (2005년 1월 26일). “Internals of Java Class Loading”. onjava.com. 2009년 10월 2일에 확인함. 
  3. “Understanding Extension Class Loading”. java.sun.com. 2008년 2월 14일. 2009년 12월 8일에 확인함. 
  4. Sosnoski, Dennis (2003년 4월 29일). “Classes and class loading”. ibm.com. 2008년 1월 26일에 확인함. 
  5. These libraries are stored in Jar files called rt.jar, core.jar, server.jar, etc.
  6. http://docs.oracle.com/javase/tutorial/ext/basics/load.html

외부 링크 편집