기능이 많이 추가되면서 클래스 개수도 많아지면 어떻게 될까? 관련 있는 기능들끼리 분류해야 할 필요가 있을 것이다. 마치 폴더, 디렉터리처럼 자바에도 “패키지” 라는 개념이 존재한다.
바로 사용법에 대해 알아보자. 패키지를 먼저 만들고 클래스를 만들어야 하는데, 여기서 패키지의 위치에 주의하자.
package pack;
public class Data {
public Data() {
System.out.println("패키지 pack Data 생성");
}
}
위와 같이, 패키지를 사용할 때는 항상 코드 첫줄에 패키지 이름을 적어줘야 한다. 지금 만든 Data 클래스를 통해 인스턴스가 생성되면 생성자를 통해 정보를 출력한다.
이제 pack 패키지 아래에 a라는 패키지를 만들자. 그리고 pack 패키지에 PackageMain1 클래스를 만들고, main() 메서드를 작성한다.
package pack.a;
public class User {
public User() {
System.out.println("패키지 pack.a 회원 생성");
}
}
package pack;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
pack.a.User user = new pack.a.User();
}
}
/*
패키지 pack Data 생성
패키지 pack.a 회원 생성
*/
PackageMain1과 Data는 같은 pack 패키지에 속해 있으므로, Data 인스턴스를 그냥 생성하면 되지만, User는 다른 패키지에 있으므로, 위와 같이 패키지 전체 경로를 포함해서(원칙적으로는…) 클래스를 적어줘야 한다.
근데 다른 패키지에 있는 클래스를 사용할 때마다 저렇게 전체 경로를 가져오는 건 너무 불편해보인다. 이때 import문을 사용할 수 있다.
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하고 나머지를 패키지를 포함한 전체 경로를 적어주면 된다.
패키지의 이름과 위치는 폴더 위치와 같아야 한다. 또, 관례적으로 패키지의 이름은 모두 소문자를 사용하고, 패키지의 이름 앞 부분에 com.mycompany.myapp처럼 회사의 도메인 이름을 거꾸로 사용한다.
계층 구조에 대해서도 알아보자. 패키지는 보통 아래와 같이 구조를 이룬다.
abc
이런 구조에서는 패키지가 a, a.b, a.c 이렇게 3개가 있는 것이다. 계층 구조상 a 패키지 하위에 a.b, a.c 패키지가 있는 것이다. 하여간 3개 모두 각기 완전히 다른 패키지고, 각 패키지의 클래스에서 다른 패키지의 클래스를 사용하고 싶다면, import 문을 사용해서 끌어와야 한다.
실제 패키지가 어떻게 사용되는지 예제를 통해 알아보자.
<전체 구조도>
com.helloshopuserUserUserServiceproductProductProductServiceorderOrderOrderServiceOrderHistory회원, 제품, 주문 패키지가 존재하고, 그 안에 각각의 클래스가 존재한다.
주문을 하려면, 주문을 진행한 사용자와 주문한 제품 정보를 끌고 와야 할 것이다. 아래 코드를 통해 간단히 살펴보고 넘어가자.
package com.helloshop.order;
import com.helloshop.product.Product;
import com.helloshop.user.User;
public class Order {
User user;
Product product;
public Order(User user, Product product) {
this.user = user;
this.product = product;
}
}
package com.helloshop.order;
import com.helloshop.product.Product;
import com.helloshop.user.User;
public class OrderService {
public void order() {
User user = new User();
Product product = new Product();
Order order = new Order(user, product);
}
}