본문 바로가기
언어/java

[Java] 10. 라이브러리와 모듈 (2) - 5~9

by 젼젼39 2025. 7. 7.

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 자바 표준 모듈

(내용 추가해서 더 정리할 예정!)