본문 바로가기

Java/Java 문법

[Java] package, import

728x90
반응형

패키지 (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

 

 

 

 

 

728x90
반응형