패키지 (package)
패키지는 하나의 프로젝트에서 여러 개의 소스파일을 사용할 때 서로 다른 소스파일을 구분하기 위하여 사용한다.
C++이나 C#에서의 namespace와 유사한 역할을 한다고 생각하면 된다.
만약 패키지를 명시하지 않으면 Java의 기본 패키지를 사용하고 있는 것이다.
패키지는 소스코드당 한 번만 선언할 수 있으며 소스코드의 가장 첫 번째 줄에 위치해야 한다.
예를 들어 아래 코드처럼 작성된 두 개의 소스파일이 있다고 해보자.
package test1;
public class MyClass { }
package test2;
public class MyClass { }
이제 해당 프로젝트에서는 import를 통해서 같은 이름의 MyClass를 사용하는 것이 가능하다.
import
import를 통해서 다른 소스파일에 선언된 변수나 클래스 등을 사용하는 것이 가능하다.
import는 package 선언 다음에 작성해야 하며 import 패키지명.클래스명; 의 형태로 사용할 수 있다.
이때 import 한 여러 개의 소스파일 중 같은 이름의 변수나 메서드, 클래스 등이 있다면 package이름을 명시해주어야 한다.
import test1.MyClass;
import test2.MyClass;
public class Main {
public static void main(String[] args) {
test1.MyClass myclass1 = new test1.MyClass;
test2.MyClass myclass2 = new test2.MyClass;
}
}
패키지와 파일 시스템
Java는 파일 시스템을 이용해서 패키지를 관리한다.
패키지를 사용하기 위해서는 해당 패키지 이름을 가진 디렉터리 안에 소스파일이 존재해야 한다.
예를 들어 package mypackage; 를 선언했다면 해당 코드가 포함된 소스코드는 mypackage 폴더 안에 존재해야 한다.
계층적 패키지 정의
package 패키지1.[패키지2.[패키지3]]; 과 같은 구조로 사용하는 것이 가능하다.
예를 들어 a폴더 안에 b폴더 안에 c폴더가 있다고 가정하자.
세 폴더 안에는 package가 선언되어 있고 MyClass라는 이름의 클래스가 선언된 소스파일이 하나씩 있다.
이때 a폴더 안의 소스코드에서는 package a;
b폴더 안의 소스코드에서는 package a.b;
c폴더 안의 소스코드에서는 package a.b.c;
라고 명시해야 한다.
import를 할 때에도 마찬가지인데 package a의 MyClass를 사용하고 싶으면 import a.MyClass;
package b의 MyClass를 사용하고 싶으면 import a.b.MyClass;
package c의 MyClass를 사용하고 싶으면 import a.b.c.MyClass;
라고 선언하면 된다.
이때 package 안의 클래스를 모두 포함하는 것도 가능한데
import a.*; 라고 작성하면 package a에 포함되어 있는 모든 클래스를 사용하는 것이 가능하고
import a.b.*; 라고 작성하면 package b에 포함되어 있는 모든 클래스를 사용하는 것이 가능하다.
*를 사용하더라도 해당 폴더의 하위 폴더에는 접근할 수 없다.
예를 들어 import a.*; 라고 작성해도 package b의 클래스에는 접근할 수 없다.
패키지 접근 제어자
패키지 또한 접근 제어자의 영향을 받는다.
이 때문에 상속 관계와 함께 4가지 경우의 수가 생기게 된다.
각 경우의 접근 가능 여부는 다음과 같다.
private | defalut | protected | public | ||
상속 관계, 같은 패키지 | X | O | O | O | |
상속 관계, 다른 패키지 | X | O | O | O | |
상속 관계 아님, 같은 패키지 | X | X | O | O | |
상속 관계 아님, 다른 패키지 | X | X | X | O |
'Java > Java 문법' 카테고리의 다른 글
[Java] Iterator 인터페이스 (0) | 2024.10.14 |
---|---|
[Java] 컬렉션 프레임워크 (Collection Framework), List 인터페이스 (List interface) (0) | 2024.10.14 |
[Java] 오브젝트 클래스 (Object Class) (0) | 2024.10.11 |
[Java] final (0) | 2024.10.11 |
[Java] 추상 클래스, 추상 메서드 (abstract) (0) | 2024.10.03 |