자바에서 패키지는 클래스와 인터페이스를 그룹으로 묶어주는 개념이다.
프로젝트가 커짐에 따라 관련 기능을 그룹화하여 관리하기 위해 패키지를 사용한다.
예를 들어, 도서관 관리 시스템에서는 회원, 책, 대여와 같은 기능별로 패키지를 나누어 관리할 수 있다.
패키지는 자바에서 클래스나 인터페이스를 묶는 그룹이다. 프로그램이 커질수록 기능을 관리하기 쉽도록 패키지를 나눠야 한다. 작은 프로그램은 패키지가 없어도 큰 문제가 없지만, 규모가 커지면 관련된 기능을 나누어 관리해야 효율적이다.
Library
Book
Loan
Library
LibraryMember
LibraryHistory
Book
BookCatalog
BookCover
Loan
LoanService
LoanHistory
프로그램이 커지면 위처럼 다양한 클래스들이 필요하게 된다.
이를 효과적으로 관리하기 위해 패키지로 나누는 것이 중요하다.
패키지를 사용하면 관련된 클래스들을 그룹으로 나눌 수 있다.
아래와 같이 회원, 대여, 책 등의 기능을 패키지로 나누어 관리할 수 있다.
* member
* LibraryMember
* MemberManager
* MemberActivityHistory
* book
* Book
* BookCatalog
* BookCover
* loan
* Loan
* LoanService
* LoanHistory
* reservation
* Reservation
* ReservationItem
* notification
* Notification
* NotificationHistory
* shipping
* Shipping
* ShippingTracker
위 구조처럼 패키지를 나누면 관련 클래스들을 한 곳에 모아 관리할 수 있다.
자바에서 패키지 이름은 보통 소문자로 작성하는 것이 관례이다.
패키지 생성 및 클래스 작성
패키지를 생성한 후 그 안에 클래스를 작성해야 한다.
패키지를 사용할 때는 클래스 첫 줄에 패키지 이름을 명시한다.
Client 패키지 생성
package client;
public class Client {
public Client() {
System.out.println("패키지 client 생성");
}
}
Client 패키지 사용
package main;
import client.Client;
public class Main {
public static void main(String[] args) {
Client client = new Client(); // client 패키지에서 클래스 가져오기
}
}
import 키워드를 사용하면 다른 패키지의 클래스를 쉽게 가져올 수 있다.
매번 전체 경로를 작성할 필요 없이 클래스 이름만으로 사용할 수 있다.
package main;
import client.Client;
import order.Order;
public class Main {
public static void main(String[] args) {
Client client = new Client();
Order order = new Order();
}
}
패키지 전체 import
패키지 내의 모든 클래스를 사용하고 싶다면 *을 사용할 수 있다.
import client.*;
import order.*;
패키지 규칙에 따라 자바 파일의 위치와 패키지 이름은 일치해야 한다.
패키지 이름은 관례상 소문자를 사용하며, 도메인 이름을 거꾸로 사용해 패키지를 시작한다.
예를 들어, 도메인이 dropzone.com이라면 com.dropzone으로 패키지 이름을 작성한다.
외부 라이브러리와 충돌을 방지하기 위해 패키지 이름 앞에 도메인 이름을 거꾸로 사용한다.
이렇게 하면 같은 이름의 클래스를 사용할 때 중복을 피할 수 있다.
내가 만든 애플리케이션을 배포할 때, 패키지 이름이 겹칠 가능성을 줄이는 방법이다.
현재 진행 중인 프로젝트의 패키지 구조를 예시로 들자면 다음과 같다.
com.dropzone
├── auth
├── challenge
├── character
├── config
├── friend
├── matchstatistics
├── ranking.entity
├── user

이 구조는 기능별로 나뉜 패키지들로 이루어져 있다.
예를 들어 auth 패키지는 인증 관련 클래스들, challenge 패키지는 도전 과제 관련 클래스들, matchstatistics는 경기 통계 관련 클래스를 관리한다.