10.5 패키지 은닉
- 모듈은 모듈 기술자에서 exports 키워드를 사용해 내부 패키지 중 외부에서 사용할 패키지를 지정함
(exports되지 않은 패키지는 자동적으로 은닉됨)
- 모듈이 일부 패키지를 은닉하는 이유
1) 모듈 사용 방법 통일
: 모듈 외부에서 exports하지 않은 패키지 사용을 막고, exports한 패키지로 사용 방법을 통일
2) 쉬운 수정
: 모듈 성능 향상을 위해 exports하지 않은 패키지들을 수정하더라도 exports한 패키지는 변함이 없기 때문에,
모듈 사용 방법이 동일해 외부에 영향을 주지 않음
//module-info.java
module my_module_a {
exports pack1;
//exports pack2; <- 은닉!
}
//A.java
package pack1;
import pack2.B; //<-추가된 내용
public class A {
//메소드
public void method() {
System.out.println("A-method 실행");
}
//B 클래스 사용 <- 추가된 내용
B b = new B();
b.method();
}
10.6 전이 의존
두 모듈을 직접적으로 requires하고 있던 프로젝트의 의존 관계를 일렬로 변경하면, 프로젝트는 requires로 작성하지 않은 제일 위의 모듈을 사용할 수 없어 컴파일 오류가 발생함
module my_application_2 {
requires my_module_a;
}
module my_module_a {
exports pack1;
requires my_module_b;
}
-> 해당 패키지 코드를 모두 제거하거나
-> (requires로 작성한 모듈 소속의 클래스가 상기 모듈 소속의 객체를 리턴하는 경우) 전자의 모듈 기술자에 transitive 키워드와 함께 후자를 의존 설정하면 프로젝트에서도 사용 가능함 [의존 설정 전이]
module my_application_2 {
requires my_module_a;
}
module my_module_a {
exports pack1;
requires transitive my_module_b; //<- my_module_b 모듈 의존 설정
}
(실행 부분은 추후 따라 하면서 내용 추가 예정)
10.7 집합 모듈
* 집합 모듈 : 여러 모듈을 모아놓은 모듈
- 자주 사용되는 모듈들을 일일이 requires 하는 번거로움을 피하고 싶을 때 집합 모듈을 생성하면 됨
- 집합 모듈은 자체적인 패키지를 가지지 않음 -> 모듈 기술자에 전이 의존 설정만 함
- my_module은 my_module_a와 b를 제공하는 집합 모듈이라고 가정하면, my_module의 모듈 기술자는 다음과 같다
module my_module {
requires transitive my_module_a;
requires transitive my_module_b;
}
(실행 부분은 추후 따라 하면서 내용 추가 예정)
10.8 리플렉션 허용
* 리플렉션(refliection) : 실행 도중에 타입(클래스, 인터페이스 등)을 검사하고 구성 멤버를 조사하는 것
- 은닉된 패키지는 기본적으로 다른 모듈에 의해 리플렉션을 허용하지 않음
- 하지만 경우에 따라서는 은닉된 패키지도 리플렉션을 허용해야 할 때가 있음
(모듈 기술자를 통해 모듈 전체 / 지정된 패키지에 대해 리플렉션을 허용할 수 있고, 특정 외부 모듈에서만 리플렉션을 허용할 수도 있음)
- export된 패키지는 언제든지 리플렉션이 가능함 <- opens로 지정할 필요 없음
- opens : 은닉된 패키지 중 특정 패키지에 대한 리플렉션을 허용함
//1. 모듈 전체를 리플렉션 허용
open module 모듈명 {
...
}
//2. 지정된 패키지에 대해 리플렉션 허용
module 모듈명 {
...
opens 패키지1;
opens 패키지2;
}
//3. 지정된 패키지에 대해 특정 외부 모듈에서만 리플렉션 허용
module 모듈명 {
...
opens 패키지1 to 외부모듈명, 외부모듈명, ...;
opens 패키지2 to 외부모듈명;
}
10.9 자바 표준 모듈
(내용 추가해서 더 정리할 예정!)
'언어 > java' 카테고리의 다른 글
[Java] 11. 예외 처리 (2) - 4~6 (0) | 2025.07.13 |
---|---|
[Java] 11. 예외 처리 (1) - 1~3 (0) | 2025.07.08 |
[Java] 10. 라이브러리와 모듈 (1) - 1~4 (0) | 2025.07.06 |
[Java] 9. 인터페이스 (2) - 5~7 (0) | 2025.07.01 |
[Java] 9. 인터페이스 (1) - 1~4 (0) | 2025.07.01 |