프로그램이 작을 때는 클래스 몇 개만 있어도 충분하지만, 프로젝트가 커지면 수십~수백 개의 클래스가 등장한다. 이때 관련된 클래스들을 논리적으로 묶어 관리할 수 있는 도구가 바로 패키지(Package)이다.
패키지란?
- 클래스들을 논리적 그룹으로 묶어주는 이름 공간(namespace)이다.
- 파일 시스템의 폴더/디렉토리와 유사하다.
- 프로젝트 규모가 커질수록 유지보수성과 가독성을 높여준다.
예시: 쇼핑몰 시스템
com.helloshop
├ user
│ ├ User
│ └ UserService
├ product
│ ├ Product
│ └ ProductService
└ order
├ Order
├ OrderService
└ OrderHistory
- 관련 클래스는 같은 패키지에,
- 성격이 다른 클래스는 다른 패키지로 분리한다.
패키지 선언과 사용
package pack;
public class Data {
public Data() {
System.out.println("pack.Data 생성");
}
}
- 클래스 첫 줄에 package 패키지명;을 반드시 선언해야 한다.
- 같은 패키지에 속하면 import 없이 사용할 수 있다.
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로 단축
}
}
- 특정 패키지 전체 가져오기: import pack.a.*;
- 클래스 이름이 중복될 경우 → 하나는 import, 다른 하나는 전체 경로 사용
import pack.a.User;
User userA = new User();
pack.b.User userB = new pack.b.User();
패키지 규칙
- 패키지 이름과 디렉토리 위치는 일치해야 한다. (필수)
- 이름은 소문자를 사용한다. (관례)
- 일반적으로 회사 도메인을 거꾸로 사용 → 충돌 방지 목적!
- 예: com.company.myapp
- 패키지가 계층 구조처럼 보여도, 실제로는 각각 독립적인 패키지이다.
- a, a.b, a.c는 서로 다른 패키지이다.
- 따라서 a에 있는 클래스가 a.b의 클래스를 쓰려면 import가 필요하다.
정리하자면...
- 패키지는 클래스를 논리적으로 묶는 도구이다.
- package: 클래스가 어느 패키지에 속하는지 표시하는 키워드
- import: 다른 패키지 클래스를 가져다 쓸 때 편하게 쓰는 키워드
- 클래스명이 같아도 패키지명은 다르기 때문에 이름 중복 문제를 해결하고, 프로젝트 구조를 명확히 만든다.
- 패키지 계층 구조는 논리적 구분일 뿐, 서로 다른 패키지이므로 import가 필요하다.
- 관례적으로 도메인 거꾸로 + 기능명으로 패키지를 구성한다. (com.myapp.user)
패키지를 잘 설계하면 클래스 관리, 협업, 유지보수가 훨씬 쉬워진다.
'java' 카테고리의 다른 글
| Java 메모리 구조와 static 정리 (0) | 2025.09.15 |
|---|---|
| Java 접근 제어자(Access Modifier)와 캡슐화 (1) | 2025.09.14 |
| Java 생성자(Constructor) 정리 (0) | 2025.09.14 |
| Java 객체 지향 프로그래밍(OOP) 정리 (0) | 2025.09.14 |
| Java 기본형(Primitive) vs 참조형(Reference) 정리 (0) | 2025.09.14 |