자바의 패키지(package): 구조, 선언, classpath

ppp·2025년 6월 3일

Java 공부

목록 보기
2/13
post-thumbnail

자바를 학습하다 보면 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란?

classpath는 자바가 클래스를 찾는 경로입니다. 컴파일하거나 실행할 때 JVM이 .class 또는 .jar 파일을 어디서 찾을지를 지정합니다.

예시: classpath 설정 (Linux/macOS 기준)

export CLASSPATH=.:lib/mylib.jar
설정 값설명
.현재 디렉터리 포함
lib/mylib.jar외부 라이브러리 경로 지정

클래스 로딩 순서

단계클래스 로더설명
1부트스트랩JDK 기본 클래스 로딩 (rt.jar, 모듈 시스템 대체)
2확장 클래스 로더lib/ext 디렉터리 등
3애플리케이션 클래스 로더사용자 classpath 기반 로딩

자주 발생하는 classpath 오류

오류명설명
ClassNotFoundException클래스 경로에 .class 파일이 없음
NoClassDefFoundError컴파일 시 존재했지만 실행 시 로딩 실패

🛠 실무 팁: Maven, Gradle 같은 빌드 도구를 사용하면 classpath 문제를 자동으로 해결할 수 있습니다.


🧙‍♂️ static import 문

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 importstatic 멤버를 클래스명 없이 사용 가능

💡 실무 팁 정리

  • 모든 클래스를 명확한 패키지로 분리하세요. (com.회사명.프로젝트.모듈)

  • classpath 관련 문제는 빌드 도구(Maven/Gradle)로 해결하세요.

  • static import는 유틸성 상수메서드에 한해 사용하면 유용합니다.


자바의 패키지는 단순한 디렉터리 구조 이상의 개념입니다. 구조를 잘 잡아두면 협업, 유지보수, 배포 모든 측면에서 강력한 장점이 생깁니다. 익숙해질수록 자바의 세계가 더 잘 보이게 될 거예요! 💪

0개의 댓글