8.4 클래스 파일은 언제 로드될까?
-자바 소스 파일이 컴파일되면 클래스 파일로 변환되고, 파일 시스템에 저장된다.
클래스 파일은 자바 가상 머신(JVM)에 의하여 로드된다.
1) 클래스 파일은 요청 시 JVM에 로드된다.
=> 지연 클래스 로드 (Lazy Class Loading) 기본 방법
2) 애플리케이션 코드를 구성하는 기본적인 클래스 파일은 시작 시 로드된다.
if(result != null) {
MyClass object = new MyClass();
// 어떤 작업을 한다.
}
=> result가 null이면 내부 코드 블록은 실행되지 않는다.
이때 가상 머신은 MyClass를 메모리에 로드하지 않는다. (프로그램이 요구하지 않았기 때문)
가상 머신의 "메모리"를 절약하게 한다.
(클래스를 로드하는 책임은 가상 머신의 클래스 로더가 담당한다.)
1) 부트스트랩 클래스
2) 확장 클래스
3) 사용자 클래스
: 자바 플랫폼을 구성하는 핵심적인 클래스
-디렉터리 jre/lib에 있는 rt.jar 및 기타 여러 jar 파일들
-Java 9부터는 모듈화되어있는 jmods파일이 로드됨
: 자바 확장 메커니즘을 사용하는 클래스.
-확장 디렉터리에 있는 jar 파일들.
-디렉터리 jre/lib/ext의 모든 jar 파일은 확장으로 간주되며 로드됨.
: 확장 메커니즘을 사용하지 않는 개발자 및 타사에서 정의한 클래스.
-가상 머신 명령줄에서 -classpath 옵션을 사용하거나 CLASSPATH 환경 변수를 사용하여 이러한 클래스의 위치를 식별함.
: 사용자가 직접 작성하였거나 외부에서 다운로드 받은 클래스를 찾기 위해
가상머신이 살펴보는 디렉터리들을 모아둔 경로
-윈도우에서는 ;으로 분리되고, 유닉스에서는 :으로 분리된다.
•경로 지정 방법
(1) 가상 머신은 항상 현재 디렉터리부터 찾는다.
클래스가 현재 작업 디렉터리에 저장되어 있다면 자바 가상 머신이 가장 쉽게 찾을 수 있다.
(2) 일반적으로는 환경 변수인 CLASSPATH에 설정된 디렉터리에서 찾는다.
1/ CLASSPATH 변수를 설정하려면 명령 프롬프트에서 다음과 같은 명령어를 사용한다.
c:\> set CLASSPATH=C:\classes;C:\lib;.
-3개의 디렉터리가 ;로 분리되어 나열되어있다.
1- C:\classes
2-C:\lib
3- '.' <= 현재 디렉터리를 나타냄
2/ 제어판의 환경 변수 설정을 이용하여 CLASSPATH 환경 변수를 설정하여도 된다.
[제어판]->[시스템]->[고급 시스템 설정]->[고급]->[환경 변수]
순으로 선택하여 설정 가능하다.
(3) 가상 머신을 실행할 때 옵션 -classpath를 사용할 수 있다. 실행 시에 클래스 경로를 알려주는 것. (이클립스) 가장 권장되는 방법
C:\> java -classpath C:\classes;C:\lib;.Main
-자바에서는 실행 파일이 하나가 아니다.
-일반적으로 자바에서는 여러 개의 클래스 파일이 있어야, 하나의 프로그램이 실행된다.(!= 하나의 클래스 파일)
여러 개의 클래스 파일을 그냥 전달하여도 되지만,
자바 애플리케이션을 한 개의 파일로 만들어서 사용자에게 전달할 방법이 존재한다.
Java Archive : 자바 파일을 압축하여 하나의 파일로 만드는 데 사용한다.
EX)
C:\> jar cvf Game.jar *.class icon.png
// JDK 안에 포함된 jar 도구를 이용하여 JAR 파일을 생성할 수 있다.
C:\> jar cvfe Game.jar Main *.class icon.png
// 실행 가능한 JAR 파일을 생성하려면 e를 추가하여야 한다.
-Main.class가 제일 처음에 실행되는 클래스
C:\> java -jar Game.jar
// JAR 파일로 압축된 파일을 실행할 수 있다.
**자바 가상머신은 JAR 압축 파일에 저장된 클래스 파일을 찾아서 실행한다.
*이클립스를 사용하는 경우
-명령어 도구 외 이클립스 내부 기능
[File]->[Export] 실행
[Java]->[Runnable JAR file] 선택
/ 전문 업체에서 JAR 파일 형태의 자바 라이브러리를 구매하여 사용한다고 가정
-> 클래스 경로에 JAR 파일을 포함시키면 이 라이브러리의 클래스들을 찾을 수 있다.
Ex) 외부로부터 받은 JAR 파일 graphics.jar를 사용할 때
C:\> set CLASSPATH=C:\classes;C:\lib;C\graphics.jar;.
// 경로 찾기
*이클립스를 사용하는 경우
[Build Path]->[Add External Archives...]