java&spring

클래스 경로(Class Path)와 클래스 로더(Class Loader)

sungjine 2017. 8. 11. 20:55
반응형

 - 클래스 경로(Class Path)

 컴파일 하거나 프로그램을 실행할 때 읽어올 클래스의 위치를 나열해 놓은 것이다.


 클래스 경로를 나눌 때 두 가지로 나누는데 컴파일할 때는 빌드 타임 클래스 경로이고 실행할 때는 런 타임 클래스 경로이다.


 빌드 타임 클래스 경로는 빌드할 때 필요한 프로그램의 코드와 프로그램에서 참조하고 있는 코드 즉 빌드하기 위해 필요한 클래스들의 경로가 들어있다. 예를 들어 인터페이스와 인터페이스를 구현한 클래스가 있다면 인터페이스가 빌드 타임 클래스 경로에 있어야 한다.


 런 타임 클래스 경로는 프로그램을 실행할 때 사용되는 클래스와 프로그램을 참조하는 클래스들의 경로가 들어 있다. 예를 들어 인터페이스와 인터페이스를 구현한 클래스가 있다면 실제 구현된 코드가 런 타임 클래스 경로에 있어야한다.


 만약 빌드 타임 클래스 경로에는 클래스 경로가 있어 빌드가 되도 런 타임 클래스 경로에 클래스 경로가 없다면 런 타임시에 에러가 난다.


 * 부트 클래스 경로는 JVM이 초기화되면서 필요한 클래스들을 읽어올 경로를 나타낸다.


 - 클래스 로더(class loader)

 프로그램을 실행할 때 필요한 클래스를 요청받으면 클래스 경로에 나열되어 있는 경로에서 해당하는 클래스를 찾아 읽은 후 메모리에 로드하는 역할을 하며 아래와 같은 특징을 가진다.


 1. 계층형 구조를 가진다. 계층은 부트스트랩, 확장, 시스템, 사용자 정의 클래스 로드 순으로 상위 --> 하위 순이다.

 2. 클래스를 로딩하라는 요청이 왔을 때 로드된 클래스가 있다면 로드된 클래스를 사용하고 로드된 클래스가 없을 때 상위 클래스 로더가 있다면 상위 클래스 로더에 우선권이 있기 때문에 상위 클래스 로더에서 먼저 확인을 하고 없다면 로딩하게 된다.

 3. 하위 클래스 로더는 상위 클래스 로더에 로딩된 클래스를 사용할 수 있지만 상위 클래스 로더는 하위 클래스 로더에 로딩된 클래스를 사용할 수 없다. 그리고 같은 선상에 위치한 클래스 로더들은 서로에 대해서 사용하지 못한다.

 4. 클래스 로더에 로딩된 클래스들은 삭제할 수 없다. 따라서 클래스를 삭제하고 싶다면 클래스 로더를 삭제한 후 다시 생성하여 다시 로드하는 방법밖에 없다.


부트스트랩 클래스 로더(Bootstrap Class Loader)

가장 먼저 클래스를 로드하며 자바를 실행하기 위해 주요 자바 클래스와 런타임 클래스를 로드한다. (일반적으로 JRE\lib\rt.jar(런타임 클래스)및 java.lang.* 패키지 클래스와 같은 핵심 클래스를 로드한다.)

최상위 클래스 로더이기에 상위 클래스 로드가 없다.


확장 클래스 로더(Extension Class Loader)

부트스트랩 클래스 로더의 하위 클래스 로더이다.

JDK 확장 디렉토리(일반적으로 JRE/lib/ext 디렉토리)에서 클래스를 로드한다.


시스템 클래스 로더(System Class Loader)

클래스 경로에 나열된 위치에 있는 코드를 로드한다.

사용자가 생성한 모든 클래스 로드의 상위 클래스 로드이다.


사용자 정의 클래스 로더(User Define Class Loader)

사용자가 직접 생성하여 사용하는 클래스 로더들을 뜻한다.


* 추가 : 

클래스 로더가 클래스 경로에 나열된 경로를 읽어올 때 그 파일이 "jar" 안에 들어가 있거나 아예 존재하지 않을 수도 있다. 여기서 존재하지 않을 수 있다는 말을 풀어서 쓰자면 클래스 로더는 요청에 대한 내용을 반환하기만 하면 되기 때문에 반드시 파일 시스템 즉 요청한 폴더에 파일이 없더라도 자원을 반환할 수만 있다면 된다는 뜻이다. 예를 들자면 서블릿이 URL에 해당하는 요청을 받으면 응답을 반환하는 것이지 그 구현이 반드시 해당 URL을 디렉터리 경로로 변환해서 파일을 읽어올 이유가 없는 것과 비슷하다.

반응형