Java 9 Module
Java 9 Module
기존 자바의 문제점
- 클래스 단위의 접근 지정은 가능하였음
- public, private…
- 그러나 모듈 단위의 접근 지정은?
- (사용자) 저 클래스를 써도 되는 것일까?
- (개발자) 이 유틸 클래스는 밖에서 쓰면 안 되는데…
- javadoc나 유저 가이드에 적는 수밖에 없었음!
- JUnit 5의 유저 가이드 참고
junit-platform-commons
- JUnit 5의 유저 가이드 참고
Java 9 에서 발생한 자바 모듈의 변화
- 프로젝트 직소!
- 자바 코어를 모듈화 하여 런타임에 필요한 모듈만 로드하도록 함
- module-info.java
- 모듈의 의존성 정보, 접근 정보 설정 가능
예시
모듈 선언
exports
를 사용하여 외부에서 접근 가능한 패키지 지정 가능exports
로 선언한 패키지 경로에 속한 클래스(혹은 인터페이스, 열거형 등) 에만 접근 가능- 선언 패키지에 속한 하위 패키지에는
exports
설정이 적용되지 않음
- sub/module-info.java
// module-info.java
module sub {
requires java.base;
// 이 경우 com.awayday.sub 직할 클래스는 모듈 외부에서 접근 가능하나,
// com.awayday.sub.util 과 같은, 하위 패키지의 클래스는 모듈 외부에서 접근 불가능.
exports com.awayday.sub;
}
모듈 사용
- 모듈 사용 시에는
requires
를 사용하여 사용할 모듈을 지정- 해당 모듈에서
exports
하지 않는 자원은 사용 불가
- 해당 모듈에서
- main/module-info.java
// module-info.java
module jdk9module {
requires sub;
}
- main/Main.java
// Main.java
package com.awayday.main;
import com.awayday.sub.Service;
// import com.awayday.sub.util.Util;
public class Main {
public static void main(String[] args) {
// ERROR : 'sub'(module) doesn't export 'util'(package)
// Util.printInteger("zero", 0);
// RUN
Service.printCalcurateResult(4, 2);
}
}