클래스를 구분짓는 폴더 개념
패키지는 클래스를 유일하게 만들어주는 "식별자" 역할을 한다.
자바는 패키지의 가장 상위 디렉토리(root) 에서 실행해야한다는 약속이 있기 때문에 해당 패키지로 가서 컴파일 하지 않는다.
패키지 이름과 위치한 폴더의 이름이 같아야한다.
패키지이름을 java 로 시작하면 안된다.
이 둘을 합쳐야 완전하게 한 클래스를 표현한다고 할 수 있으며 FQCN(Fully Qualified Class Name) 이라고 한다.
자바는 개발자들이 사용할 수 있도록 여러 많은 패키지 및 클래스를 제공한다.
즉, Java API에 포함되는 다수의 클래스를 포함하는 패키지이다
빌트 인 패키지 종류로는 다음과 같다
패키지에 다수의 클래스를 import 하는 경우 import 패키지명.* 처럼 import 할 수 있다.
서로 다른 패키지에 동일한 클래스 이름이 존재하고, 두 패키지가 모두 import 되어 있는 경우에는 어떤 패키지의 클래스를 로딩할지 결정할 수 없기 때문에 컴파일 에러가 발생한다. 따라서 이 경우에는 FQCN로 작성해야한다.
ex)
package com.mycompany;
import com.hankook.*;
import com.kumho.*;
public class Car{
SnowTire snowTire = new SnowTire();
BigWidthTire bigWidthTire = new BigWidthTire();
com.hankook.Tire hankookTire = new com.hankook.Tire();
com.kumho.Tire kumnhoTire = new com.kumho.Tire();
}
클래스를 찾기위한 경로.
JVM이 프로그램을 실행할 때, 클래스파일을 찾는 데 사용한다.
즉, JVM은 CLASSPATH의 경로를 확인하여 라이브러리 클래스들의위치를 참조하게 된다. 그러나 J2JDK 버전부터는 \jre\lib\ext 폴더에 필요한 클래스 라이브러리들을 복사해 놓으면 사용가능하여 특별한 경우가 아니면 설정을 하지 않는다.
classpath 옵션은 java와 javac 명령어에 모두 사용할 수 있다.
JVM의 클래스로더는 런타임 시에 $CLASSPATH 환경변수를 호출해 해당 디렉토리에 정의된 클래스들을 로딩하게 된다.
클래스 로더는 다음과 같이 3종류가 존재한다.
BootStrap Class Loader
Extension Class Loader
System Class Loader
JRE와 JDK 사이에는 차이가 있다.
JRE는 JDK 중에서 java 프로그램을 실행하는 프로그램만 포함된 환경이다.
따라서, JRE는 classes.zip 파일에서 클래스를 찾지 않는다.
대신 rt.jar 파일을 사용한다.
rt.jar 파일에는 classes.zip과 동일한 클래스가 모두 포함되어 있고, 아카이브 형식과 이름만 다른 것을 사용한다. Java 1.2가 발표되면서 classes.zip 파일은 없어졌다.
대신, JDK와 JRE가 모두 "rt.jar" 파일을 사용한다.
"rt.jar" 파일을 classpath에 지정해야 하는가에 대해서는 classes.zip 파일과 동일한 규칙이 적용되며, 즉 지정할 필요가 없다.
참조