패키지(Package) 자바 파일 관리·이름 충돌 방지
자바 패키지(package)는 관련된 클래스·인터페이스를 논리적으로 그룹화해 대규모 프로젝트에서도 깔끔한 파일 관리와 이름 충돌 방지를 가능하게 해 주는 필수 구조입니다.
패키지를 올바르게 설계하면 모듈화·재사용성이 높아지고, 협업 시 코드 위치를 바로 찾아볼 수 있어 생산성이 크게 향상됩니다.
패키지 기본 개념과 필요성
패키지란?
- 클래스/인터페이스 묶음을 의미하는 자바의 네임스페이스
- 실제로는 디렉터리 구조와 1 : 1로 매핑되어 빌드·배포 과정을 단순화
- 동일 프로젝트 안에서도 동일 클래스명을 패키지별로 중복 선언할 수 있어 충돌 걱정 ↓
왜 패키지가 중요한가?
- 파일 관리 용이 – 기능별로 디렉터리를 나눠 소스 탐색이 빠름
- 이름 충돌 방지 –
java.util.Datevsjava.sql.Date처럼 안전하게 공존 - 모듈화·재사용성 – 유틸·도메인·UI 등으로 분리해 재사용 극대화
패키지 선언 및 구조 설계
패키지 선언 방법
package com.example.project; // 소스 최상단 한 줄
public class MyClass {
public void hello() {
System.out.println("Hello from MyClass!");
}
}
패키지 이름은 도메인 거꾸로 + 프로젝트명을 권장합니다.
예)
com.companyname.billing
물리적 디렉터리 매핑
com.example.project → /com/example/project/ 디렉터리로 소스 파일을 배치해야 컴파일 오류가 나지 않습니다.
다른 패키지 클래스 사용하기
1. 풀 네임(완전 수식) 사용
com.example.project.MyClass obj = new com.example.project.MyClass();
2. import 문으로 간편 사용
import com.example.project.MyClass; // ① 특정 클래스
import java.util.*; // ② 패키지 내 전체 클래스
public class Main {
public static void main(String[] args) {
MyClass obj = new MyClass(); // 클래스명만으로 사용
obj.hello();
}
}
TIP : java.lang 패키지는 자동으로 로드되므로 String, Math 등은 import가 필요 없습니다.
패키지 계층화 전략
폴더·패키지 이름 규칙
| 계층 | 예시 패키지명 | 역할 |
|---|---|---|
| root | com.company |
최상위 도메인 |
| module | com.company.billing |
비즈니스 도메인 |
| layer | com.company.billing.controller |
MVC·계층 구분 |
| feature | com.company.billing.controller.invoice |
세부 기능 |
- 계층이 깊어질수록 구조가 명확해지지만, 과도한 분리는 오히려 복잡도를 올립니다.
- 폴더명 = 패키지명이므로 해당 구조를 IDE·빌드 도구에서 그대로 인식합니다.
실전 예제: 패키지로 모듈화
src/
└─ com/
└─ example/
├─ util/
│ └─ StringUtils.java
├─ model/
│ └─ User.java
└─ main/
└─ App.java
App.java
package com.example.main;
import com.example.util.StringUtils;
import com.example.model.User;
public class App {
public static void main(String[] args) {
User user = new User("Alice");
System.out.println(StringUtils.capitalize(user.getName()));
}
}
각 패키지가 분리된 책임을 가지므로 유지보수가 쉬워집니다.
질문 정리
-
패키지를 선언하지 않으면?
이름 없는 패키지(unnamed package)에 속합니다. 작은 실습에는 편하지만, 다른 패키지에서 접근이 불편해 대규모 프로젝트에서는 지양합니다.
-
하위 패키지도 로 import할 수 있나요?
불가합니다.
import java.util.*;은java.util직계 클래스만 포함하고java.util.concurrent는 포함하지 않습니다. -
패키지명을 바꾸면 어떤 이점이 있나요?
역할이 명확해지고 빌드 도구·모듈 시스템과 호환성이 좋아집니다. 반대로 이름이 잦은 변경을 피해야 의존성 관리가 편합니다.
-
동일 클래스명이 꼭 충돌하지 않나요?
네. 서로 다른 패키지면 Fully Qualified Name이 달라 충돌이 없습니다. 단, 동일 패키지 내 중복은 불가합니다.
댓글남기기