본문 바로가기

프로그래밍언어/JAVA

[JAVA] 자바 패키지

반응형

1. 패키지 (package)

패키지란 클래스의 묶음이다. 패키지에는 클래스와 인터페이스를 포함시킬 수 있으며 관련된 클래스들끼리 그룹 단위로 묶어 놓음으로써 클래스를 효율적으로 관리할 수 있다. 같은 이름의 클래스이더라도 서로 다른 패키지에 위치시키는 것이 가능하기 때문에 같은 이름의 클래스끼리  충돌하는 것을 방지할 수 있다.

클래스가 컴파일되면 하나의 클래스 파일 (.class)가 되는 것처럼 패키지 또한 물리적인 구조를 가지는데, 디렉토리를 통해 계층이 이루어진다. 예를들어 java.lang.String 클래스는 java 디렉토리 안의 lang 디렉토리에 해당 클래스 파일이 위치하고 있다.

하나의 소스파일은 첫번쨰 문장에 package 키워드로 패키지를 선언할 수 있으며, 단 한번의 선언만 허용한다. 모든 클래스는 하나의 패키지에 속해야 하며, 패키지 선언 시에 '.'을 구분자로 사용하여 계층을 표현할 수 있다.


2. 패키지의 선언

패키지는 package 키워드를 사용하여 선언할 수 있다.

 

// package 키워드 뒤에 현재 소스 파일의 패키지 구조를 작성해준다.
package hierarchy.of.package;


패키지를 선언하는 경우 주석과 공백을 제외하고 소스 파일 최상단에 선언해야 한다. 패키지 명에 대소문자 모두 사용 가능하지만 보통은 클래스명과 구분하기 위해 소문자로 선언한다.

패키지를 명시적으로 선언하지 않는 경우 자바에서 기본적으로 제공하는 unnamed package로 인식된다. 결국 패키지를 지정하지 않은 모든 클래스들은 같은 패키지에 속하게 된다.

javac로 클래스를 컴파일할 때 -d 옵션을 주어서 지정된 경로에 빌드된 클래스 파일을 생성할 수 있다. 이때 지정된 위치에 패키지 구조와 일치하는 디렉토리가 없다면 자동으로 디렉토리를 생성하여 클래스 파일을 위치하도록 한다.

 

// '.' 를 사용하여 현재 위치에 Child 소스파일을 컴파일한 파일들을 위치하도록 한다.
java -d . Child.java


만약 -d 옵션을 따로 사용하지 않은 경우 현재 위치에 자동으로 디렉토리를 생성하도록 한다.

컴파일을 한 후에는 루트 디렉토리를 클래스 패스에 포함시켜야 한다. 클래스 패스에 루트 디렉토리를 포함시켜야지 JVM에서 클래스의 위치를 찾아서 실행시킬 수 있다.


3. import 문

소스코드에서 다른 패키지의 클래스를 사용하기 위해서는 패키지명을 포함한 클래스 이름을 사용하여 import 해주어야 한다. 클래스의 코드를 작성하기 전에 import 문에서 사용하고자 하는 클래스의 패키지를 미리 명시해주면 소스코드에 사용되는 클래스 이름에서 패키지명은 생략할 수 있다.

import 문의 역할은 컴파일러에세 소스파일에 사용된 클래스의 패키지 정보를 제공하는 것이다.


4. import 문의 선언

import 문은 package 문 다음에, 그리고 해당 클래스 선언 문 이전에 위치해야 한다. 그리고 import 문은 패키지 문과 달리 여러번 선언할 수 있다.

 

import package.name.class;

// *를 사용하면 해당 패키지의 모든 클래스를 포함한다.
// 주의해야할 점은 *를 사용한다고 해당 패키지의 클래스들의 하위 클래스들까지 포함하지는 않는다는 것이다.
import package.name.*;

 

 

5. static import 문

import 문을 사용하면 클래스의 패키지명을 생략할 수 있는 것과 같이 static import 문을 사용하면 static 멤버를 호출할 때 클래스 이름을 생략할 수 있다.  특정 클래스의 static 멤버를 자주 사용하는 경우 편리하게 사용할 수 있다

반응형

'프로그래밍언어 > JAVA' 카테고리의 다른 글

[JAVA] 다형성 (Polymorphism)  (0) 2021.11.19
[JAVA] 제어자 (Modifier)  (0) 2021.11.16
[JAVA] 오버라이딩 (Overriding)  (0) 2021.11.08
[JAVA] 상속 (Inheritance)  (0) 2021.11.04
[JAVA] HashMap vs HashTable  (0) 2021.10.29