프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것
일반적으로 .jar 형태로 존재하고, JAR 파일에는 클래스와 인터페이스의 바이트코드 파일(.class)들이 압축돼있다.
특정 클래스와 인터페이스가 여러 응용프로그램을 개발할 때 공통으로 자주 사용된다면 JAR파일로 압축해서 라이브러리로 관리하는 것이 좋다.
패키지 관리 기능까지 포함된 라이브러리는 Java9부터 지원한다. 모듈은 일부 패키지를 은닉하여 접근할 수 없게끔 할 수 있다.
의존 모듈을 모듈 기술자(module-info.java)에 기술할 수 있어 모듈 간 의존 관계를 파악하기 쉽다.
대규모 응용 프로그램은 기능별로 모듈화해서 개발, 재사용성 및 유지보수에 유리하다.
응용프로그램을 기능별로 서브 프로젝트(모듈)로 쪼갠 다음 조합해서 개발
응용프로그램의 규모가 클수록 협업과 유지보수 측면에서 모듈화에 유리하다. 다른 응용프로그램에서도 재사용이 가능하다.
다른 모듈에서 쉽게 사용할 수 있게 바이트코드 파일(.class)로 구성된 배포용 JAR 파일을 모듈별로 따로 생성할 수 있다.
모듈은 모듈 기술자에서 exports 키워드를 사용해 내부 패키지 중 외부에서 사용할 패키지를 지정한다.
exports되지 않은 패키지는 자동적으로 은닉한다.
한 가지 패키지로 모듈 사용 방법을 통일한다. 다른 패키지를 수정하더라도 모듈 사용 방법이 바뀌지 않아 외부에 영향을 주지 않는다.
여러 모듈을 모아놓은 모듈
자주 사용되는 모듈들을 일일이 requires하지 않아 편리하다. 집합 모듈은 자체적인 패키지를 가지지 않고, 모듈 기술자에 전이 의존 설정만 한다.
실행 도중에 타입(클래스, 인터페이스 등)을 검사하고 구성 멤버를 조사하는 것
은닉된 패키지는 기본적으로 다른 모듈에 의해 리플렉션을 허용하지 않는다. 모듈은 모듈 기술자를 통해 모듈 전체 또는 지정된 패키지에 대해 리플렉션을 허용할 수 있고, 특정 외부 모듈에서만 리플렉션을 허용할 수 있다.
JDK가 제공하는 표준 라이브러리는 Java9부터 모듈화 됐다.
응용프로그램을 실행하는데 필요한 모듈만으로 구성된 작은 사이즈의 자바 실행 환경이다.