Notice
Recent Posts
Recent Comments
Link
개발 무지렁이
[Java] 모듈: 패키지 은닉과 전이 의존 본문
모듈이란?
패키지 관리기능까지 포함된 라이브러리이다.(~.jar 파일로 배포)
라이브러리는 내부에 포함된 모든 패키지(package)에 접근가능하지만,
모듈은 패키지 은닉으로 일부 패키지에 접근할 수 없게 할 수 있다.
라이브러리는 내부에 포함된 모든 패키지(package)에 접근가능하지만,
모듈은 패키지 은닉으로 일부 패키지에 접근할 수 없게 할 수 있다.
🧰 모듈기술자(module-info.java)를 통해 필요로 하는 의존모듈을 기술할 수 있어
모듈간 의존관계를 쉽게 파악할 수 있다.
응용프로그램의 모듈화(서브프로젝트) 🍕 in eclipse 🪐
🧩 재사용성 및 🧩 유지보수에 유리
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_module_a
✔️ Create module-info.java file
📂src
-> pack1 -> A.java ('A-method 실행' 출력하는 method 정의)
-> pack2 -> B.java ('B-method 실행' 출력하는 method 정의)
📜 module-info.java (exports pack1; exports pack2; 추가➕: 모듈이 가진 패키지를 외부에서 사용할 수 있도록 노출)
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_module_b
✔️ Create module-info.java file
📂src
-> pack3 -> C.java ('C-method 실행' 출력하는 method 정의)
📜 module-info.java (exports pack3; 추가➕)
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_application_2: 모듈(~.jar)을 가져와서 사용하는 프로그램
✔️ Create module-info.java file
[프로젝트 우클릭🖱️] -> [Build Path] -> [Configure Build Path ...] -> [📑Projects]
[Modulepath] -> [Add] -> ✔️ my_module_a, ✔️ my_module_b
📂src
-> app -> Main.java () (a.method(), b.method(), c.method() 호출확인, import pack1.A; import pack2.B; import pack3.C;)
📜 module-info.java (requires my_module_a; requires my_module_b 추가➕)
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_module_a
✔️ Create module-info.java file
📂src
-> pack1 -> A.java ('A-method 실행' 출력하는 method 정의)
-> pack2 -> B.java ('B-method 실행' 출력하는 method 정의)
📜 module-info.java (exports pack1; exports pack2; 추가➕: 모듈이 가진 패키지를 외부에서 사용할 수 있도록 노출)
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_module_b
✔️ Create module-info.java file
📂src
-> pack3 -> C.java ('C-method 실행' 출력하는 method 정의)
📜 module-info.java (exports pack3; 추가➕)
🪐 [File] -> [New] -> [Project] -> [Java Project]
my_application_2: 모듈(~.jar)을 가져와서 사용하는 프로그램
✔️ Create module-info.java file
[프로젝트 우클릭🖱️] -> [Build Path] -> [Configure Build Path ...] -> [📑Projects]
[Modulepath] -> [Add] -> ✔️ my_module_a, ✔️ my_module_b
📂src
-> app -> Main.java () (a.method(), b.method(), c.method() 호출확인, import pack1.A; import pack2.B; import pack3.C;)
📜 module-info.java (requires my_module_a; requires my_module_b 추가➕)
모듈의 기능1️⃣: 패키지 은닉
[my_module_a] -> [📜 module-info.java]
exports pack2; 제거 ❌ (은닉)
(my_module_a의 Main함수에서는 import pack2.B; 가능, 내부이니까)
exports pack2; 제거 ❌ (은닉)
(my_module_a의 Main함수에서는 import pack2.B; 가능, 내부이니까)
⭐ A.java
package pack1;
import pack2.B;
public class A {
public void method() {
System.out.println("A-method 실행");
B b = new B();
b.method(); //외부에서 호출할 수 있는 패키지가 A뿐이니, A의 method 안에 B의 메서드를 넣어준다.
}
}
모듈의 기능2️⃣: 전이 의존
my_application_2 -> my_module_a -> my_module_b
[my_application_2] -> [📜 module-info.java]
requires my_module_b; 제거 ❌
[my_module_a] -> [📜 module-info.java]
requires my_module_b; 추가 ➕
[my_module_a] 우클릭🖱️ -> [Build Path] -> [Configure Build Path ...]
[📑Projects] -> [Modulepath] -> [Add] -> ✔️ my_module_b -> [OK]
[my_module_a] -> [📜 module-info.java]
requires transitive my_module_b; 추가 ➕
⭐ A.java
package pack1;
import pack2.B;
import pack3.C;
public class A {
public void method() {
System.out.println("A-method 실행");
B b = new B();
b.method();
}
public C getC() {
C c = new C();
return c;
}
}
⭐ Main.java
package app;
import pack1.A;
import pack3.C;
public class Main {
public static void main(String[] args) {
A a = new A();
a.method();
C res = a.getC();
res.method();
}
}
'Backend > 자바' 카테고리의 다른 글
[Java] 날짜 시간 클래스 LocalDateTime과 형식클래스 DateTimeFormatter (0) | 2023.08.09 |
---|---|
[Java] JDBC드라이버 의존성을 추가하고, Connection 객체를 생성해 ConnectionPool 구현하기 (0) | 2023.08.06 |
[Java] eclipse에서 jar 압축파일 형태의 라이브러리 생성 및 적용 (0) | 2023.08.04 |
[Java] 한정된 값을 가지는 열거(enum) 타입 (0) | 2023.08.03 |
[Java] openJDK 다운과 시스템 환경변수 설정, Eclipse 기본 세팅 (0) | 2023.07.12 |
Comments