패키지(pakage)
는 여러 클래스들을 모은 하나의 묶음입니다. 클래스 뿐만 아니라 추후에 다룰 인터페이스라는 것도 패키지에 포함될 수 있습니다.
패키지
를 사용하는 이유는 서로 관련있는 클래스들을 하나의 묶음으로 만들어 관련하기 편하도록 만들어줄 수 있기 때문입니다. 만약 서로 다른 패키지에 위치한다면 같은 이름의 클래스가 존재할 수도 있습니다. 그렇기 때문에 클래스의 원래 이름은 패키지 이름까지 묶어서 불러야합니다.
한 가지 예시를 들자면 이전에 썼던 입력받기 위한 Scanner 클래스 인데요. Scanner 클래스는 java.util.Scanner
가 원래의 명칭이고 우리는 편의상 Scanner 클래스라고 부르는 것이 됩니다.
이러한 클래스가 하나의 .java
파일이듯이 패키지는 하나의 디렉토리
가 됩니다. 즉, 패키지는 디렉토리고 클래스는 그 내부에 속한 파일이라는 것 입니다. 위에서 언급한 Scanner 클래스는 java.util.Scanner
이니까 java
디렉토리의 util
디렉토리 내부의 Scanner.java
가 클래스의 위치이면서 패키지가 되는 것 입니다.
간단히 말해서 프로젝트 구조에서 패키지는 디렉토리가 되고, 클래스는 파일이 된다라고 할 수 있습니다.
패키지
는 다음 네 가지 조건을 준수해야합니다.
.
을 통해 계층 구조를 형성할 수 있다. (디렉토리의 서브 디렉토리를 허용).class
파일을 포함하는 하나의 디렉토리이다.패키지를 선언하는 방법은 아주 쉽습니다.
package 패키지명;
패키지
는 위에서 언급한대로 하나의 소스파일의 가장 맨 위에서만 선언될 수 있습니다.
그런데 우리들은 여태까지 학습해오면서 패키지를 선언한 적이 없죠?
패키지가 지정되지 않은 경우, 자동적으로 빈 패키지(이름 없는 패키지)에 속하도록 자동적으로 지정해주고 있습니다. 그렇기 때문에 여태까지 패키지 선언을 따로 하지 않아도 아무런 문제가 발생하지 않았던 것이었습니다.
지금까지 만들었던 이 클래스들이 모두 이름없는 패키지에 자동적으로 들어가있던 것이었습니다. 당장은 학습이기도 하고 정말 간단한 프로그램이라면 패키지를 따로 해주지 않아도 괜찮지만 가급적이면 패키지를 생성해서 분류해두고 관리하는 습관을 들이면 좋습니다.
같은 패키지 내부의 클래스라면 얼마든지 끌어다 써도 문제가 발생하지 않지만 다른 패키지에 속한 클래스를 쓰는 경우에는 이를 소스 코드에 알려야합니다.
패키지명이 포함된 클래스의 정식 명칭을 가져와서 코드에 알리는데 이때 사용하는 것이 import
문입니다.
import
문은 소스코드에 최상단에 오는데, package
문 다음으로 오게 됩니다.
그렇기에
.java
파일은 아래와 같은 순서대로 구성됩니다.
1. package
2. import
3. class
import
문은 다음과 같이 선언합니다.
import 패키지명.클래스명;
이때 특정 패키지 내부의 모든(또는 여러) 클래스에 접근하고자 할때는 패키지명 뒤에 .*
을 붙여줍니다. .*
은 해당 패키지(디렉토리)의 모든 하위 파일을 지정하는 키워드입니다.
import 패키지명.*;
위에서 예시로든
java.util
의 Scanner를 포함한 여러 메소드를 사용하고 싶다면 아래와 같이 사용합니다.import java.util.*;
.*
은 하위 패키지의 모든 클래스만을 지정하기 때문에 하위 패키지의 하위 패키지는 지정할 수 없습니다.import java.lang.*; import java.util.*; //위 두 코드를 아래처럼 줄일 수는 없습니다!!! import java.*;
static import
는 JDK 1.5에서 추가된 기능입니다.
static import
는 static 멤버를 호출할 때 클래스이름을 생략할 수 있게 해주는 import 구문입니다.
기존의 static 멤버는 다음과 같이 클래스 이름을 쓰고 호출했습니다.
public class Main {
public static void main(String[] args) {
System.out.println(Math.random());
}
}
static import로 해당 패키지를 import 하면 클래스명을 생략할 수 있습니다.
문법을 칭할 땐 static import지만, 실제 사용은 import static입니다.
import static java.lang.Math.*; //부를
public class Main {
public static void main(String[] args) {
System.out.println(random());
}
}
이름을 줄인다는 것은 코딩이 편리해지지만, 다른 사람이 읽을 때 자칫하면 오해를 불러일으킬 수 있는 구문이기도 하기에 주의해서 사용해야합니다.