Java 9에서 도입된 모듈 시스템(JPMS)에는 이름 없는 모듈(Unnamed Module)이라는 특별한 개념이 있습니다. 이름 없는 모듈은 이름 없는 패키지(unnamed package)와 밀접한 관련이 있는데, 어떤 명명된 모듈(named module)에도 속하지 않고 클래스패스(classpath)에 있는 JAR 파일에 존재하는 패키지나 클래스들이 여기에 해당합니다.
만약 코드가 이러한 파일들로부터 타입(type)을 로드하려고 하면, 모듈 시스템은 자동으로 클래스패스를 탐색하여 해당 타입을 로드합니다. 즉, 기존 방식대로 작성된 코드도 모듈 시스템 환경에서 문제없이 동작할 수 있도록 지원하는 역할을 합니다.
이름 없는 모듈의 특징
이름 없는 모듈은 다른 모든 모듈을 읽을(read) 수 있습니다. 여기에는 명명된 모듈뿐만 아니라 내장 플랫폼 모듈(built-in platform modules) 전부가 포함됩니다. 또한 자신이 가진 모든 패키지를 외부로 내보내기(export)합니다. 반대로, 이름 없는 모듈 안의 패키지 중 명명된 모듈에서 이미 정의되어 있는 것들은 무시됩니다.
정리하면, 이름 없는 모듈은 다음 두 가지에 접근할 수 있습니다.
- 모듈 패스(module-path)에서 사용 가능한 모든 모듈이 내보낸(exported) 모든 패키지
- 클래스패스상의 모든 JAR 파일 (즉, 이 이름 없는 모듈에 존재하는 그 밖의 모든 타입)
실행 구문
java --module-path out --module moduleName/com.tutorialspoint.UnnamedModuleTest
예제 코드
아래 예제는 현재 클래스가 속한 모듈 정보를 조회하고, 해당 모듈이 이름 없는 모듈인지 확인하는 방법을 보여줍니다.
public class UnnamedModuleTest {
public static void main(String args[]) {
Module module = UnnamedModuleTest.class.getModule();
System.out.println("Module: " + module);
System.out.println("Name: " + module.getName());
System.out.println("isNamed: " + module.isNamed());
System.out.println("Descriptor: " + module.getDescriptor());
}
}실행 결과
Module: unnamed module @c818063 Name: null isNamed: false Descriptor: null
결과 분석
출력 결과를 보면 알 수 있듯이, 클래스패스에서 실행된 UnnamedModuleTest 클래스는 명명된 모듈이 아닌 이름 없는 모듈에 속합니다. 따라서 getName()과 getDescriptor()는 null을 반환하고, isNamed() 메서드는 false를 반환합니다. 이처럼 이름 없는 모듈은 별도의 module-info.java 선언 없이 기존 클래스패스 기반 애플리케이션을 Java 9 이상 환경에서도 원활하게 실행할 수 있게 해주는 호환성 메커니즘이라고 할 수 있습니다.