자바를 학습하다 보면 package 라는 키워드를 자주 만나게 됩니다. 처음에는 단순한 폴더 개념처럼 보이지만, 실제로는 클래스의 관리, 충돌 방지, 배포, 보안 등 다양한 역할을 수행하는 중요한 개념입니다.
이번 글에서는 자바의 패키지에 대해 자세히 알아보고, 실제 코드 예제와 함께 classpath 설정, static import 문까지 깔끔하게 정리해보겠습니다.
패키지(Package)는 쉽게 말해 클래스들의 논리적 묶음입니다. 물리적으로는 디렉터리 구조이며, 논리적으로는 클래스 네임스페이스 역할을 합니다.
| 항목 | 설명 |
|---|---|
| 정의 | 관련된 클래스나 인터페이스를 묶는 단위 |
| 물리적 구조 | 하나의 디렉터리 |
| 클래스 전체 이름 | 패키지명.클래스명 (ex. java.lang.String) |
예시: java.lang.String 클래스는 실제로 java 디렉터리 안의 lang 디렉터리에 위치한 String.class 파일입니다.
클래스 충돌 방지: 같은 이름의 클래스라도 서로 다른 패키지에 있으면 사용할 수 있습니다.
관리 용이성: 관련 있는 클래스를 모아 관리하기 쉽습니다.
접근 제어: 패키지 접근 제어자를 통해 클래스의 접근 범위를 제한할 수 있습니다.
패키지를 선언할 때는 .java 소스 파일의 맨 위에 package 문을 작성해야 합니다.
package com.codechobo.book;
public class PackageTest {
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
파일 최상단(주석/공백 제외)에 선언해야 함
한 파일에 한 번만 선언 가능
일반적으로 소문자로 구성 (클래스명과 구분 용이)
패키지를 선언하지 않은 클래스는 자동으로 이름 없는 패키지(default package)에 포함됩니다.
public class Hello {
public static void main(String[] args) {
System.out.println("Hello from default package!");
}
}
⚠ 주의: 이름 없는 패키지는 대규모 프로젝트나 외부 라이브러리와 연동 시 충돌 가능성이 높기 때문에, 실무에서는 거의 사용하지 않습니다.
classpath는 자바가 클래스를 찾는 경로입니다. 컴파일하거나 실행할 때 JVM이 .class 또는 .jar 파일을 어디서 찾을지를 지정합니다.
export CLASSPATH=.:lib/mylib.jar
| 설정 값 | 설명 |
|---|---|
. | 현재 디렉터리 포함 |
lib/mylib.jar | 외부 라이브러리 경로 지정 |
| 단계 | 클래스 로더 | 설명 |
|---|---|---|
| 1 | 부트스트랩 | JDK 기본 클래스 로딩 (rt.jar, 모듈 시스템 대체) |
| 2 | 확장 클래스 로더 | lib/ext 디렉터리 등 |
| 3 | 애플리케이션 클래스 로더 | 사용자 classpath 기반 로딩 ✅ |
| 오류명 | 설명 |
|---|---|
ClassNotFoundException | 클래스 경로에 .class 파일이 없음 |
NoClassDefFoundError | 컴파일 시 존재했지만 실행 시 로딩 실패 |
🛠 실무 팁: Maven, Gradle 같은 빌드 도구를 사용하면 classpath 문제를 자동으로 해결할 수 있습니다.
import static 구문을 사용하면 static 멤버(메서드, 변수)를 클래스명 없이 사용할 수 있습니다.
import static java.lang.System.out;
import static java.lang.Math.*;
class Main {
public static void main(String[] args) {
out.println(random()); // Math.random()
out.println("PI: " + PI); // Math.PI
}
}
| 일반 방식 | static import 사용 시 |
|---|---|
System.out.println(...) | out.println(...) |
Math.random() | random() |
| 항목 | 핵심 요약 |
|---|---|
| 패키지란? | 클래스의 논리적/물리적 묶음 |
| 선언 방법 | .java 파일 최상단에 package 작성 |
| 이름 없는 패키지 | 패키지 미지정 시 포함, 실무에서는 비추천 |
| classpath | 자바 클래스의 탐색 경로 설정 |
| static import | static 멤버를 클래스명 없이 사용 가능 |
모든 클래스를 명확한 패키지로 분리하세요. (com.회사명.프로젝트.모듈)
classpath 관련 문제는 빌드 도구(Maven/Gradle)로 해결하세요.
static import는 유틸성 상수나 메서드에 한해 사용하면 유용합니다.
자바의 패키지는 단순한 디렉터리 구조 이상의 개념입니다. 구조를 잘 잡아두면 협업, 유지보수, 배포 모든 측면에서 강력한 장점이 생깁니다. 익숙해질수록 자바의 세계가 더 잘 보이게 될 거예요! 💪