JAVA 9주차

ndy·2022년 11월 21일

Java

목록 보기
9/10

10장 라이브러리와 모듈

10.1 라이브러리

  • 라이브러리는 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것을 말함
  • ~.jar 형태로 존재
  • JAR 파일에는 클래스와 인터페이스의 바이트코드 파일(~.class)들이 압축되어 있음
package app;

import pack1.A;
import pack2.B;

public class Main {
	public static void main(String[] args) {
		A a = new A();
		a.method();
		
		B b = new B();
		b.method();
	}
}

10.2 모듈

  • 패키지 관리 기능까지 포함된 라이브러리이다.
  • 패키지 은닉 가능
  • 모듈이 실행될 때 필요로 하는 의존 모듈을 모듈 기술자에 기술할 수 있음
  • 모듈도 라이브러리처럼 jar 파일 형태로 배포 가능
  • 대규모 응용프로그램은 기능별로 모듈화해서 개발할 수 있음

10.3 응용프로그램 모듈화

  • 응용프로그램은 기능별로 서브 프로젝트(모듈)로 쪼갠 다음 조합해서 개발할 수 있음

    my_application_2 응용프로그램은 2개의 my_moudle_a, my_module_b로 쪼개어 개발하고, 이들을 조합해서 완성 했다.

my_module_a / src / module-info.java

module my_module_a {
	exports pack1;		//pack1 사용가능
	//exports pack2;	//pack2 사용불가
}

my_module_b / src / module-info.java

module my_module_b {
	exports pack3;		//pack3 사용가능
	exports pack4;		//pack4 사용가능
}


my_application_2 / src / module-info.java

module my_application_2 {
	requires my_module_a;	// my_module_a를 필요로 함
	requires my_module_b;	// my_module_b를 필요로 함
}	

my_application_2 / src / app / main.java

package app;

import pack1.A;
import pack2.B;	// 오류
import pack3.C;
import pack4.D;

public class main {
	public static void main(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();
	}
}

10.4 모듈 배포용 JAR 파일

10.3은 프로젝트 형식으로 모듈을 조합해서 응용프로그램을 완성했지만
10.4는 서브 모듈을 jar파일로 압축하여 라이브러리 형식으로 모듈을 조합해서 응용프로그램을 완성했다.


10.5 패키지 은닉


모듈 외부에서 pack2pack3를 사용하지 못하도록 설정함


10.6 전이 의존


my_application_2 모듈이 my_module_b를 사용할 수 없음

my_application_2 / src / module-info.java

module my_application_2 {
	requires my_module_a;	// my_module_a를 필요로 함
}	

my_module_a / src / module-info.java

module my_module_a {
	exports pack1;			// pack1 사용가능
	requires my_module_b;	// my_module_b를 필요로 함
}

my_application_2 모듈이 my_module_b를 사용할 수 있게 하는 방법
transitive 사용

my_application_2 / src / module-info.java

module my_application_2 {
	requires my_module_a;	// my_module_a를 필요로 함
}	

my_module_a / src / module-info.java

module my_module_a {
	exports pack1;			// pack1 사용가능
	requires transitive my_module_b;	// my_module_b를 필요로 함
    // transitive 사용
}

10.7 집합 모듈

  • 여러 모듈을 모아놓은 모듈을 말함
  • 모듈들을 일일이 requires 하는 번거로움을 피할 수 있음

module-info.java

module my_module {
	requires transitive my_module_a;
	requires transitive my_module_b;
}

module-info.java 파일만 있는 my_module모듈
my_modulerequires 하면 my_module_a, my_module_b 모두 사용가능


10.8 리플렉션 허용

  • 리플렉션 : 프로그램 실행 도중에 타입(클래스, 인터페이스 등)을 검사하고 구성 맴버를 조사하는 것을 말함

  • 은닉된 패키지는 기본적으로 다른 모듈에 의해 리플렉션을 허용하지 않음

open module 모듈명 {

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

10.9 자바 표준 모듈

  • JDK가 제공하는 표준 라이브러리이다.
  • java.seJDK가 제공하는 모든 모듈을 제공하는 모듈 집합이다.
  • 표준 라이브러리를 모듈화한 이유는 응용프로그램을 실행하는데 필요한 모듈만으로 구성된 작은 사이즈의 자바 실행 환경(JRE)을 만들기 위해서이다.

0개의 댓글