📦 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 필요
✅ 와일드카드 (*) → 현재 패키지만 포함
✅ 이름 충돌 → 클래스 전체 이름 사용