클래스들을 관련 있는 기능들끼리(카테고리화) 분류해서 관리하는 개념을 패키지라고 한다.
package pack;
public class Data {
public Data() {
System.out.println("package pack Data gen");
}
}
package pack과 같이 패키지 이름을 적어줘야 한다. package pack.a;
public class User {
public User() {
System.out.println("package pack.a user gen");
}
}
pack 하위에 a라는 패키지를 먼저 만들자.pack.a 패키지에 User 클래스를 만들었다. c.f
생성자에 public 을 사용했다. 다른 패키지에서 이 클래스의 생성자를 호출하려면 public 을 사용해야 한다. 자세한 내용은 접근 제어자 파트에서..
package pack;
public class PackageMain1 {
public static void main(String[] args) {
Data data = new Data();
pack.a.User user = new pack.a.User();
}
}
pack 패키지 위치에 PackageMain1 클래스를 만든다.

PackageMain1과 User)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 pack;
import pack.a.*;
public class PackageMain2 {
public static void main(String[] args) {
Data data = new Data();
User user = new User();
}
}
패키지 덕분에 클래스 이름이 같아도 패키지 이름으로 구분해서 같은 이름의 클래스를 사용할 수 있다.
package pack.b;
public class User {
public User() {
System.out.println("package pack.b. user gen");
}
}
package pack;
import pack.a.User;
public class PackageMain3 {
public static void main(String[] args) {
User userA = new User();
pack.b.User userB = new pack.b.User();
}
}
자주 사용하는 클래스를 import 하고 나머지를 패키지를 포함한 전체 경로를 적어주면 된다. 물론 둘다 전체 경로를 적어준다면 import 를 사용하지 않아도 된다.
패키지는 계층 구조를 이룬다.
a, a.b, a.c
세 가지 패키지가 존재하게 된다.
➡️ 패키지가 계층 구조를 이루더라도 모든 패키지는 서로 다른 패키지이다.
예제 통해 패키지 사용법 알아보기.

package com.helloshop.user;
public class User {
String userId;
String name;
}
package com.helloshop.user;
public class UserService {
}
package com.helloshop.product;
public class Product {
String productID;
int price;
}
package com.helloshop.product;
public class ProductService {
}
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;
}
}
다른 패키지의 기능이 필요하면 import를 사용하면 된다.
public이 붙어있어야 다른 패키지에서 생성자를 호출할 수 있다.
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);
}
}
package com.helloshop.order;
public class OrderHistory {
}