
처음에는 프로그램이 작아서 클래스가 몇 개 없을 때는 크게 문제가 되지 않는다.
하지만 기능이 추가되고 규모가 커지면 클래스의 수가 수십, 수백 개까지 늘어난다.
예시:
아주 작은 프로그램
Order
User
Product
큰 프로그램
User, UserManager, UserHistory
Product, ProductCatalog, ProductImage
Order, OrderService, OrderHistory
ShoppingCart, CartItem
Payment, PaymentHistory
Shipment, ShipmentTracker
이렇게 많아지면 관련된 기능을 묶어 관리해야 한다.
컴퓨터에서 파일을 관리할 때 폴더를 쓰듯, 자바에서도 비슷한 개념을 제공하는데, 그것이 바로 패키지(package)다.
패키지는 클래스 파일 상단에 package 키워드로 선언한다.
package pack;
public class Data {
public Data() {
System.out.println("패키지 pack Data 생성");
}
}
pack 패키지에 Data 클래스를 정의했다.package pack;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
pack.a.User user = new pack.a.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(); // import로 패키지명 생략 가능
}
}
import는 package 선언 다음 줄에 작성한다. *를 사용할 수 있다. import pack.a.*; // pack.a 패키지의 모든 클래스 사용
패키지를 쓰면 클래스 이름이 같아도 구분할 수 있다.
pack.a.User
pack.b.User
이 경우 둘 다 쓰고 싶다면:
import pack.a.User;
public class PackageMain3 {
public static void main(String[] args) {
User userA = new User(); // import한 클래스
pack.b.User userB = new pack.b.User(); // 전체 경로로 명시
}
}
com.company.myapp 여러 라이브러리가 함께 쓰일 때 같은 이름 충돌을 방지하기 위한 관례다
패키지는 보통 계층 구조로 관리한다.
a
a.b
a.c
a, a.b, a.c는 서로 다른 패키지다. a 패키지 안에서 a.b를 사용하려면 반드시 import해야 한다. 실제 애플리케이션 패키지 구성 예:
com.helloshop
├── user
│ ├── User
│ └── UserService
├── product
│ ├── Product
│ └── ProductService
└── order
├── Order
├── OrderService
└── OrderHistory
import를 사용한다. 예시:
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;
}
}