패키지(package)
- 하나의 소스 파일에는 첫 번째 문장으로 단 한 번의 패키지 선언만을 허용한다.
- 모든 클래스는 반드시 하나의 패키지에 속해야 한다.
- 패키지는 점(.)을 구분자로 하여 계층 구조로 구성할 수 있다.
- 패키지는 물리적으로 클래스 파일(.class)을 포함하는 하나의 디렉토리이다.
- 클래스의 실제 이름은 패키지명을 포함한 것이다.
- 같은 이름의 클래스 일지라도 서로 다른 패키지에 존재하는 것이 가능하다.
- 소스파일에 자신이 속할 패키지를 지정하지 않은 클래스는 자동적으로 '이름 없는 패키지'에 속하게 된다.
- -d 옵션
package com.javachobo.book;
- 위 패키지 선언문이 들어가 있는 소스 파일(
PackageTest.java
)을 작성한 뒤 '-d 옵션'을 추가하여 컴파일을 했을 때, 지정된 패키지와 일치하는 디렉토리가 존재하지 않는다면 자동적으로 생성한다. 소스파일에 지정된 경로에 패키지가 있다면 그 디렉토리를 기준 삼는다. - -d 옵션 뒤에 해당 패키지의 루트(root) 디렉토리 경로를 적어준다. 만약 현재 디렉토리를 루트 디렉토리를 하고 싶다면 점(.)만 추가해주면 된다. 그러면
현재 디렉토리\com\javachobo\book
구조로 디렉토리가 생성된 다음 클래스 파일이 생성된다. - 이대로 JVM은 이 클래스 파일을 실행하지 못한다. 클래스패스에 루트 디렉토리 정보가 없기 때문이다. 패키지의 루트 디렉토리를 클래스패스가 포함시켜야 JVM이 PackageTest 클래스를 찾을 수 있다.
- 클래스패스를 지정해주지 않으면 기본적으로 현재 디렉토리(.)가 클래스패스로 지정되지만, 이처럼 클래스패스를 따로 지정해주느 경우에는 더 이상 현재 디렉토리가 자동적으로 클래스패스로 지정되지 않기 때문에 별도로 추가를 해줘야 한다.
import
클래스의 코드를 작성하기 전에 import문으로 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지명은 생략할 수 있다.
import문은 프로그램의 성능에 전혀 영향을 미치지 않는다. import문을 많이 사용하면 컴파일 시간이 아주 조금 더 길어질 뿐이다.
한 패키지에서 여러 클래스를 사용하는 경우 클래스의 이름을 일일이 지정해주는 것보다 '패키지명.*'과 하는 것이 편리하다.
하지만, import하는 패키지의 수가 많을 때는 어느 클래스가 어느 패키지에 속하는지 구별하기 어렵다는 단점이 있다.
import문에서 클래스의 이름 대신 '*'을 사용하는 것이 하위 패키지의 클래스까지 포함하는 것은 아니라는 것이다.
import java.util.*; import java.text.*;
위 두 문장 대신 다음과 같이 할 수 없다.
import java.*;
지금까지 System과 String 같은 java.lang패키지의 클래스들을 패키지명 없이 사용할 수 있었던 이유는 모든 소스파일에는 묵시적으로 다음과 같은 import문이 선언되어 있었기 떄문이다.
import java.lang.*;
static import
- static import문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다. 특정 클래스의 static 멤버를 자주 사용할 때 편리하고 코드도 간결해진다.
import static java.lang.Integer.*;
import static java.lang.Math.random;
import static java.lang.System.out;
- 이렇게 선언했다면
System.out.println(Math.random());
를out.println(random());
로 간략히 할 수 있다.
'프로그래밍-학습기록 > Java' 카테고리의 다른 글
Annotation(애너테이션, 어노테이션) (0) | 2020.12.25 |
---|---|
BufferedReader / BufferedWriter (0) | 2020.07.10 |