1 분 소요

자바 패키지(package)는 관련된 클래스·인터페이스를 논리적으로 그룹화해 대규모 프로젝트에서도 깔끔한 파일 관리이름 충돌 방지를 가능하게 해 주는 필수 구조입니다.

패키지를 올바르게 설계하면 모듈화·재사용성이 높아지고, 협업 시 코드 위치를 바로 찾아볼 수 있어 생산성이 크게 향상됩니다.


패키지 기본 개념과 필요성

패키지란?

  • 클래스/인터페이스 묶음을 의미하는 자바의 네임스페이스
  • 실제로는 디렉터리 구조와 1 : 1로 매핑되어 빌드·배포 과정을 단순화
  • 동일 프로젝트 안에서도 동일 클래스명을 패키지별로 중복 선언할 수 있어 충돌 걱정 ↓

왜 패키지가 중요한가?

  1. 파일 관리 용이 – 기능별로 디렉터리를 나눠 소스 탐색이 빠름
  2. 이름 충돌 방지java.util.Date vs java.sql.Date처럼 안전하게 공존
  3. 모듈화·재사용성 – 유틸·도메인·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()));
    }
}

각 패키지가 분리된 책임을 가지므로 유지보수가 쉬워집니다.


질문 정리

  1. 패키지를 선언하지 않으면?

    이름 없는 패키지(unnamed package)에 속합니다. 작은 실습에는 편하지만, 다른 패키지에서 접근이 불편해 대규모 프로젝트에서는 지양합니다.

  2. 하위 패키지도 로 import할 수 있나요?

    불가합니다. import java.util.*;java.util 직계 클래스만 포함하고 java.util.concurrent는 포함하지 않습니다.

  3. 패키지명을 바꾸면 어떤 이점이 있나요?

    역할이 명확해지고 빌드 도구·모듈 시스템과 호환성이 좋아집니다. 반대로 이름이 잦은 변경을 피해야 의존성 관리가 편합니다.

  4. 동일 클래스명이 꼭 충돌하지 않나요?

    네. 서로 다른 패키지면 Fully Qualified Name이 달라 충돌이 없습니다. 단, 동일 패키지 내 중복은 불가합니다.

카테고리:

업데이트:

댓글남기기