개발 무지렁이

[Java] 모듈: 패키지 은닉과 전이 의존 본문

Backend/자바

[Java] 모듈: 패키지 은닉과 전이 의존

Gaejirang-e 2023. 8. 5. 06:29

모듈이란?
패키지 관리기능까지 포함된 라이브러리이다.(~.jar 파일로 배포)
라이브러리는 내부에 포함된 모든 패키지(package)에 접근가능하지만,
모듈은 패키지 은닉으로 일부 패키지에 접근할 수 없게 할 수 있다.

🧰 모듈기술자(module-info.java)를 통해 필요로 하는 의존모듈을 기술할 수 있어
  모듈간 의존관계를 쉽게 파악할 수 있다.

📕 참고 자료: vs 라이브러리 📕
Tistory's Card

응용프로그램의 모듈화(서브프로젝트) 🍕 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 추가➕)

모듈의 기능1️⃣: 패키지 은닉
[my_module_a] -> [📜 module-info.java]
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();
      }
  }
Comments