" 자바의 패키지에 대해 학습하세요. "
패키지는 서로 관련된 클래스와 인터페이스의 컴파일 된 클래스 파일들을 하나의 디렉터리에 묶어 놓은 것이다.
그림과 같이 서로 다른 패키지에 있다면 같은 이름의 클래스를 사용하는 것이 가능하다.
특징)
- 하나의 소스파일에는 첫 번째 문장으로 단 한번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.(java 기본제공 - unnamed package)
- 패키지는 점(.)을 구분자로 계층구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스 파일을 포함하는 하나의 디렉토리이다.
패키지 선언은 다음과 같이 하며 반드시 주석과 공백을 제외한 첫 줄에 선언해야 함.
// package 패키지명;
package UI; // Tools 클래스를 컴파일하여 UI 패키지에 저장할 것을 지시.
public class Tools { ... } // 이 클래스의 경로명은 UI.Tools가 된다.
자바에서 java.lang은 자주 사용되는 패키지이지만 import 하여 사용하지 않는다. 이 패키지는 아주 기본적인 것들이기 때문에 import로 불러오지 않아도 자바에서 자동으로 java.lang 클래스를 불러온다.
다음 그림은 Java가 제공하는 Built-in package이다. 사용자 정의 패키지와 달리 개발자들이 사용할 수 있도록 기본적으로 제공하는 패키지이다.
패키지 이름 규정은 다음과 같다.
패키지 시작 이름 | 내용 |
---|---|
java | 자바 기본 패키지(Java vendor 개발) |
javax | 자바 확장 패키지(Java vendor 개발) |
org | 일반적으로 비영리단체(오픈소스)패키지 |
com | 일반적으로 영리단체(회사)패키지 |
다른 패키지에 속하는 클래스를 사용하기 위해 import 키워드를 사용한다.
사용 방법은 다음과 같다.
// *는 현재 패키지 내의 클래스만을 의미하며 하위 패키지의 클래스까지 포함하지 않는다.
import java.util.Scanner;
public class ImportExample {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
}
}
static import는 일반적인 import와 다르게 메소드나 변수를 패키지, 클래스명 없이 접근 가능하게 해준다. JUnit 프레임워크로 테스트 코드를 작성하다 보면 이를 확인할 수 있다.
@Test
public void nonStaticImport() {
Assert.assertThat(1, CoreMatchers.is(1));
}
@Test
public void staticImport() {
assertThat(1, is(1));
}
클래스를 찾기 위한 경로로, JVM이 프로그램을 실행할 때 클래스 파일을 찾는데 기준이 되는 파일 경로이다.
소스코드(.java 파일)를 컴파일하면 바이트 코드로 변환되는데, java runtime(java 또는 jre)으로 이 .class 파일에 포함된 명령을 실행하려면, 이 파일을 찾을 수 있어야 한다. .class 파일을 찾을 때, classpath에 지정된 경로를 사용한다.
classpath는 .class 파일이 포함된 디렉토리와 파일을 콜론(;)으로 구분한 목록이다.
이 classpath를 지정하기 위한 두 가지 방법은 다음과 같다.
컴퓨터 시스템 변수 설정을 통해 지정할 수 있다.
JVM이 시작될 때 JVM의 클래스 로더는 이 환경변수를 호출하게 되고, 환경 변수에 설정되어 있는 디렉토리가 호출되면 그 디렉토리에 있는 클래스들을 먼저 JVM에 로드한다. 그러므로 CLASSPATH 환경 변수에는 필수 클래스들이 위치한 디렉토리를 등록하도록 한다.
컴파일러가 컴파일 하기 위해 필요로 하는 클래스 파일들을 찾기 위해서 컴팡리시 파일 경로를 지정해주는 옵션이다. Hello.java 파일이 C:\Java 디렉터리에 존재하고, 필요한 클래스 파일들이 C:\Java\abc 에 위치한다면, javac -classpath C:\Java\abc C:\Java\Hello.java
로 해주면 된다. 만약 참조할 클래스 파일들이 그 외의 다른 디렉토리, 그리고 현 디렉토리에도 존재한다면, javac -classpath .;C:\Java\abc;C;\Java\def C:\Java\Hello.java
와 같이 ';' 으로 구분해줄 수 있다.(. : 현 디렉토리, .. : 상위 디렉토리)
이전 포스팅 참고
<Java> 상속