Programing Language/Java

[Java] 자바 프로그램 모듈 관계 조정(Coordinating Module Relationships)

vinedpillar 2022. 7. 18. 01:31

패키지 은닉

  • 모듈 기술자(module-info)에서 exports 키워드를 사용하여 내부 패키지 중 외부 패키지에서 사용할 패키지를 지정할 수 있습니다.

  • exports된 패키지는 외부로 노출되며, exports되지 않은 패키지는 자동적으로 은닉이 됩니다.

  • 모듈이 패키지를 은닉하는 이유는 아래와 같습니다.
    • 모듈 사용 방법 통일: 외부와 접촉하는 패키지만 노출하여 모듈의 사용 방법을 통일합니다. 
    • 쉬운 수정: 접촉 모듈에 영향을 주는 다른 모듈을 수정해도 외부에 영향을 주지 않습니다.
모듈 기술자에서 패키지 은닉을 하는 방법

module 모듈이름 {
    // 외부 노출을 허용하는 패키지
    exports 패키지이름;
    ...
}

 

 

 

 

전이 의존

  • 모듈 기술자에서 requires 키워드를 사용하여 모듈간의 의존 관계를 지정할 수 있습니다.

  • 모듈간 다중적으로 의존 관계가 형성되는 경우 모듈 기술자에 하위 모듈까지 모두 기술해줘야 하는 불편이 있습니다.

  • 이 경우 transitive 키워드를 사용하여 하위 모듈을 선언해주면 상위 모듈에 대한 의존성을 전이 시킬 수 있습니다.
모듈 기술자에서 전이 의존을 하는 방법

module 메인모듈이름 {
    requires 패키지이름;
    ...
}

module 중간모듈이름1 {
    exports 패키지;
    requires transitive 중간모듈이름2;
}

module 중간모듈이름2 {
	...
}

 

 

 

 

집합 모듈

  • 집합 모듈은 여러 모듈을 모아놓은 모듈을 뜻합니다.

  • 모듈간 의존 관계를 일일이 기술하기 어려울 때 집합 모듈을 생성하여 활용할 수 있습니다.

  • 집합 모듈은 자체적인 패키지를 가지지 않고, 모듈 기술자에 전이 의존 설정만 합니다.

 

 

 

리플렉션 허용

  • 은닉된 패키지는 기본적으로 다른 모듈에 의한 리플렉션(Reflection)을 허용하지 않습니다.
    (리플렉션: 프로그램 실행 도중 타입을 검사하고 구성하는 멤버를 조사하는 것)

  • 하지만 경우에 따라 은닉된 패키지도 리플렉션을 해야하는 경우가 있는데, 모듈 기술자의 선언을 통해 이를 설정할 수 있습니다.

  • 패키지의 리플렉션 허용은 open, opens 키워드를 활용하여 지정할 수 있습니다.
모듈 기술자에서 패키지 리플렉션을 하는 방법

// 모듈 전체를 리플렉션 허용
open module 모듈이름 {
    ...
}

// 지정된 패키지에 대해 리플렉션 허용
module 모듈이름 {
    opens 패키지;
    opens 패키지;
    ...
}

// 지정된 패키지에 대해 특정 외부 모듈에서만 리플렉션 허용
module 모듈이름 {
    opens 패키지 to 외부모듈명1, 외부모듈명2;
    opens 패키지 to 외부모듈명;
    ...
}