Java - 패키지

develkkm·2025년 9월 12일

0부터 시작하는 Java

목록 보기
14/27

패키지(Package)


패키지가 필요한 이유

처음에는 프로그램이 작아서 클래스가 몇 개 없을 때는 크게 문제가 되지 않는다.
하지만 기능이 추가되고 규모가 커지면 클래스의 수가 수십, 수백 개까지 늘어난다.

예시:

  • 아주 작은 프로그램

    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

매번 전체 경로를 쓰면 불편하므로 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로 패키지명 생략 가능
    }
}
  • importpackage 선언 다음 줄에 작성한다.
  • 특정 패키지 안의 모든 클래스를 가져오려면 *를 사용할 수 있다.
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;
    }
}
profile
알던것을 더 확실하게

0개의 댓글