패키지의 필요성
개발자마다 자신의 디렉터리에 클래스를 배치한다면 파일의 디렉터리가 서로 달라 다른 파일로 인식된다. 이러한 디렉터리를 자바에서는 패키지(Package)라고 부르며, 하나의 패키지는 관련된 클래스 파일들이 들어 있는 디렉터리로 볼 수 있다. 파일의 디렉터리는 다음과 같이 점(.)을 찍어 표현한다.
Project.FileIO.Tools.class
Project.TI.Tools.class
패키지 선언
자바 소스 파일(.java)이 컴파일되어 생기는 클래스 파일(.class 파일)은 반드시 패키지에 소속되어야 한다. 클래스가 소속될 패키지 명은 다음과 같이 package 키워드를 이용하여 소스 파일의 첫 줄에 선언한다. 패키지를 만드는 방법은 다음과 같다.
Package UI; // UI 패키지 선언
public class Tools { 이제 이 클래스 디렉터리는 UI.Tools가 된다.
...
}
디폴트 패키지와 주요 패키지
package 키워드로 선언하지 않고 자바 클래스나 인터페이스를 작성하면, 자바 컴파일러는 클래스나 인터페이스를 현재 디렉터리인 디폴트 패키지에 소속시킨다. JDK 패키지 중에서 비교적 많이 사용되는 패키지들은 다음과 같다.
-
java.lang: System을 비롯하여 문자열, 수학 관련 메소드, 입출력 등과 같이 자바 프로그래밍에 필요한 기본적인 클래스와 인터페이스를 제공한다. 이 패키지의 클래스들은 특별히 import 문을 사용하지 않아도 자동으로 임포트된다.
-
java.util: 날짜, 시간, 벡터, 해시맵 등 다양한 유틸리티 클래스와 인터페이스를 제공한다.
-
java.io: 키보드, 모니터, 파일 등에 입출력하는 클래스와 인터페이스를 제공한다.
-
java.awt, javax.swing: 자바 AWT(Abstract Windowing Toolkit)와 swing 패키지로서 GUI 프로그래밍에 필요한 클래스와 인터페이스를 제공한다.
패키지의 특징
자바 패키지의 특징은 나열하면 다음과 같다.
-
계층 구조: 상속 관계에 있는 클래스나 인터페이스의 경우, 서브 클래스 파일을 슈퍼 클래스 파일이 저장된 패키지의 서브 디렉터리에 패키지를 만들어 저장하여 계층화시킬 수 있다.
-
접근 제한: default 키워드로 접근 지정자가 선언된 클래스나 멤버는 동일 패키지 내의 클래스들이 접근하도록 허용하지만, 다른 패키지의 클래스들은 접근을 막음으로써 패키지를 접근 권한의 범위로도 이용할 수 있다.
-
클래스 이름 중복 가능: 같은 패키지 내에서는 동일한 이름을 가진 클래스나 인터페이스가 존재할 수 없지만, 클래스 이름은 패키지 이름을 포함한 전체 디렉터리를 사용하기 때문에 다른 패키지에서는 서로 다른 파일로 인지하므로 가능하다.
-
높은 재사용성: 클래스와 인터페이스를 패키지로 관리하면, 유사한 기능을 수행하는 클래스나 인터페이스를 재작성할 필요 없이 프로그램에 포함하여 쉽게 사용할 수 있다.
자바의 모듈
자바 JDK는 개발자들에게 많은 클래스들을 묶어 패키지 형태로 제공하는데, 패키지들을 (JDK 9 이후부터)모듈(Module)이라는 단위로 묶어 제공한다. 자바에서 모듈은 JDK 설치 디렉터리 밑의 jmods 디렉터리에 .jmod 확장자를 가진 ZIP 포맷의 압축 파일 형태로 제공된다.
모듈화의 목적
자바 컴포넌트들을 필요에 따라 조립하여 사용하기 위함이며, 세밀한 모듈화를 통해 필요가 없는 모듈이 로드되지 않게 하여 컴퓨터 시스템에 불필요한 부담을 줄인다. 특히 소형 IoT 장치에서도 자바 응용 프로그램이 실행되고 성능을 유지하게 한다.