< 김영한의 실전 자바 - 기본편 > 강의를 보고 이해한 내용을 바탕으로 합니다.
자바에서 폴더, 디렉토리와 같은 개념.
package pack;
public class Data {
public Data(){ //다른 패키지에서 이 클래스의 생성자를 호출하려면 'public'을 사용해야한다.
System.out.println("패키지 pack data 생성");
}
}
pack
패키지 하위에 Data
클래스를 생성했다.
package pack.a;
public class User {
public User(){
System.out.println("패키지 pack.a 회원 생성");
}
}
pack
패키지 하위에 a
패키지를 생성하고 그 아래에 User
클래스를 생성했다.
package pack;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
pack.a.User user = new pack.a.User();
}
}
PackageMain1
은 pack
패키지 하위에 있으므로 같은 패키지 내에 있는 Data
는 그냥 쓰면 되고(경로 생략), 다른 패키지(a
)에 있는 User
는 앞에 경로를 명시해주고 사용하면 된다.
package pack;
import pack.a.User;
public class PackageMain2 {
public static void main(String[] args) {
Data data = new Data();
User user = new User();
}
}
코드 첫 줄에는 package
를 명시하고 다음 줄에는 import
를 쓸 수 있다.
import
를 사용하면 다른 패키지에 있는 클래스를 가져와서 사용할 수 있다.
import
를 사용한 덕분에 코드에서는 패키지 명을 생략하고 클래스 이름만 적을 수 있다.
특정 패키지에 포함된 모든 클래스를 포함해서 사용하고 싶으면 import
시점에 별(*)
을 사용하면 된다.
import pack.a.*
패키지 덕분에 클래스 이름이 같아도 패키지 이름으로 구분해서 같은 이름의 클래스를 사용할 수 있는데, 이름이 같은 경우 둘 다 사용하고 싶다면?
pack.a.User
pack.b.User
package pack;
import pack.a.User;
public class PackageMain3 {
public static void main(String[] args) {
User user = new User();
pack.b.User userB = new pack.b.User();
}
}
둘 중 하나는 무조건 경로를 모두 적어줘야 한다😅
(자주 사용하는 클래스를 import하자)
com.commpany.myapp
패키지는 보통 계층 구조를 이룬다.
* a
* b
* c
이렇게 총 세개의 패키지가 존재한다.
계층 구조 상 a
패키지 하위에 a.b
패키지와 a.c
패키지가 있다.
그런데 이는 우리 눈에 보기에 계층구조인거지 a
패키지와 a.b
, a.c
패키지는 완전히 다른 패키지이다.
따라서 서로의 패키지의 클래스가 필요하면 import
를 사용해야한다.
즉, 패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지이다.
패키지 구성할 때 서로 관련된 클래스는 하나의 패키지에 모으고 관련이 적은 클래스는 다른 패키지로 분리하는 것이 좋다.