2026년 02월 19일

📦 Java 패키지(Package) — 클래스를 식별하는 이름 공간

Java Spring Boot
Cover Image

📦 Java 패키지(Package) — 클래스를 식별하는 이름 공간

핵심 개념 : 패키지는 단순한 디렉토리가 아니라 클래스의 일부분이다. 클래스를 식별하는 용도로 사용되며, 클래스의 전체 이름에 포함된다.


1️⃣ 패키지란? — 클래스의 전체 이름

패키지 = 클래스 식별자

com.mycompany.Car     ← 클래스 전체 이름
com.yourcompany.Car   ← 다른 클래스!
요소역할
패키지명클래스를 구분하는 이름 공간
도트(.)상위↔하위 디렉토리 구분
클래스 전체 이름패키지명 + 클래스명

2️⃣ 패키지 명명 규칙 — 도메인 역순

회사 도메인 역순 사용

mycompany.com    →  com.mycompany
yourcompany.com  →  com.yourcompany
apache.org       →  org.apache

일반적인 패키지 구조

com.회사명.프로젝트명
com.samsung.projectname
com.lg.projectname
org.apache.projectname

💡 패키지 이름은 모두 소문자로 작성하는 것이 관례다.


3️⃣ 패키지 선언 — 소스 파일 최상단

package 상위패키지.하위패키지;

public class 클래스명 { ... }

예시

package com.mycompany;

public class Car {
    // ...
}

패키지 선언을 보고 컴파일러가 자동으로 디렉토리를 생성한다.


4️⃣ 패키지와 디렉토리 — 이동 불가

✅ 올바른 위치:
   com/mycompany/Car.class

❌ 잘못된 위치:
   com/yourcompany/Car.class (다른 패키지!)

⚠️ 중요: 바이트코드 파일(.class)은 패키지에서 떼어낼 수 없다.
다른 디렉토리로 이동하면 클래스를 사용할 수 없게 된다.


5️⃣ import 문 — 다른 패키지 클래스 사용

기본 규칙

상황import 필요 여부
같은 패키지 내 클래스❌ 불필요 (바로 사용 가능)
다른 패키지 내 클래스✅ 필요 (명시 필요)

작성 위치

package 패키지명;        // ① 패키지 선언

import 다른패키지.클래스;  // ② import 문

public class 클래스명 {  // ③ 클래스 선언
    // ...
}

사용 예시

package com.mycompany;

import com.hankook.Tire;  // Tire 클래스 import

public class Car {
    Tire tire = new Tire();  // Tire 사용
}

6️⃣ import 문 — 와일드카드 사용

개별 클래스 import

import com.hankook.Tire;
import com.hankook.SnowTire;
import com.hankook.AllSeasonTire;

패키지 전체 import

import com.hankook.*;  // 모든 클래스 import

⚠️ *하위 패키지를 포함하지 않는다.

import com.hankook.*;           // com.hankook 패키지만
import com.hankook.project.*;   // com.hankook.project 패키지는 별도 import

7️⃣ 클래스 이름 충돌 — 해결 방법

문제 상황

package com.hyundai;

import com.hankook.*;
import com.kumho.*;

public class Car {
    Tire tire = new Tire();  // ❌ 어느 Tire? (컴파일 에러)
}

두 패키지 모두 Tire 클래스를 가지고 있어 컴파일러가 혼란스러워한다.

해결 방법 ① — 클래스 전체 이름 사용

package com.hyundai;

// import 문 없음

public class Car {
    com.hankook.Tire tire1 = new com.hankook.Tire();  // ✅ 명확함
    com.kumho.Tire tire2 = new com.kumho.Tire();      // ✅ 명확함
}

해결 방법 ② — 하나만 import + 나머지는 전체 이름

package com.hyundai;

import com.hankook.Tire;  // Tire는 한쪽만 import

public class Car {
    Tire tire1 = new Tire();                    // ✅ com.hankook.Tire
    com.kumho.Tire tire2 = new com.kumho.Tire(); // ✅ 전체 이름 사용
}

📌 핵심 요약

개념설명
패키지클래스를 식별하는 이름 공간 (디렉토리 ≠ 패키지)
클래스 전체 이름패키지명.클래스명 (예: com.mycompany.Car)
명명 규칙도메인 역순 + 모두 소문자
패키지 선언소스 파일 최상단에 package 키워드
import다른 패키지 클래스 사용 시 필요
와일드카드*는 하위 패키지 포함 안 함
이름 충돌클래스 전체 이름으로 해결

작성 순서

① package 패키지명;
② import 다른패키지.클래스명;
③ public class 클래스명 { }

import 규칙

✅ 같은 패키지        →  import 불필요
✅ 다른 패키지        →  import 필요
✅ 와일드카드 (*)     →  현재 패키지만 포함
✅ 이름 충돌         →  클래스 전체 이름 사용
← 목록으로 돌아가기