모듈을 만들려면 필수로 모듈 기술자(module-info.java)가 있어야 한다. 모듈 기술자가 없으면 라이브러리이고, 있으면 모듈이다.
패키지 은닉
라이브러리와 달리 모듈은 패키지를 은닉하여 모듈 밖인 외부에서는 접근할 수 없게 할 수 있다.(접근 제한자 private와 비슷한 기능)
패키지 은닉 패키지를 은닉하는 이유는 아래와 같다. -패키지 1은 공개하고 패키지 2와 3은 은닉하여, 패키지 1로 사용방법을 통일할 수 있기 때문이다. -모듈 성능 향상을 위해 패키지 2와 3을 수정하더라도 외부에서는 모듈 사용 방법(패키지1)이 달라지지 않기 때문에 외부에 영향을 주지 않는다.
모듈은 자신이 실행할 때 필요로 하는 의존 모듈을 모듈 기술자에 기술할 수 있기 때문에 모듈 간의 의존 관계를 쉽게 파악 가능하다.
의존관계
모둘도 라이브러리이므로 JAR 파일 형태로 배포할 수 있다. 응용프로그램을 개발할 때 원하는 기능의 모듈을 다운로드해서 사용하면 된다.
대규모 응용프로그램은 기능별로 모듈화 해서 개발할 수도 있다. 모듈별로 개발하고 조립하는 방식을 사용하면 재사용성 및 유지 보수에 유리하다.
반드시 myapp_1도 모듈 기술자를 만들어야 한다. 왜냐하면 myapp_1은 module1과 modul_2를 사용해야 하는데 이것은 해당 모듈에 의존한다는 것이다. 때문에 이를 모듈 기술자에 써야 한다.
requires requires 키워드는 필요한 모듈을 컴파일하거나 실행할 때 필요한 의존 모듈을 지정한다. requires 키워드를 기술하고 반드시 해당 모듈이 있는 경로를 설정해야 한다.
모듈 경로를 알려주는 방법은 아래와 같다. 프로젝트 마우스 우클릭 -> Build Path -> Confugure Build Path Project 탭 -> modulepath -> add 버튼을 누르고 필요한 모듈을 선택한다.
제대로 선택이 되었다면 apply and close 버튼을 누른다.
package app;
import pack1.A;
import pack2.B;
import pack3.C;
import pack4.D;
publicclassMain{
publicstaticvoidmain(String[] args){
A a = new A();
a.method();
B b = new B();
b.method();
C c = new C();
c.method();
D d = new D();
d.method();
}
}
/*
A-method 실행
B-method 실행
C-method 실행
D-method 실행
*/
반드시 myapp_1도 모듈 기술자를 만들어야 한다. 왜냐하면 myapp_1은 module1과 modul_2를 사용해야 하는데 이것은 해당 모듈에 의존한다는 것이다. 때문에 이를 모듈 기술자에 써야 한다.
requires requires 키워드는 필요한 모듈을 컴파일하거나 실행할 때 필요한 의존 모듈을 지정한다. requires 키워드를 기술하고 반드시 해당 모듈이 있는 경로를 설정해야 한다.
JAR 모듈의 경로를 알려주는 방법은 프로젝트 모듈 경로를 알려주는 방법과 살짝 다르다. 모듈 경로를 알려주는 방법은 아래와 같다. 프로젝트 마우스 우클릭 -> Build Path -> Confugure Build Path Libraries 탭 -> Modulepath 클릭 -> add External JARs 버튼 클릭 (그냥 Add JARs 버튼은 같은 프로젝트 내에 JAR파일이 있을 때 클릭한다.)
package app;
import pack1.A;
import pack2.B;
import pack3.C;
import pack4.D;
publicclassMain{
publicstaticvoidmain(String[] args){
A a = new A();
a.method();
B b = new B();
b.method();
C c = new C();
c.method();
D d = new D();
d.method();
}
}
/*
A-method 실행
B-method 실행
C-method 실행
D-method 실행
*/