라이브러리
라이브러리는 프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것을 말한다.
일반적으로 JAR(압축파일 .jar)형태로 존재한다.=> 클래스와 인터페이스의 바이트코드 파일(~.class)들이 압축되어 있다.
ClassPath에 라이브러리를 추가하는 방법
=>라이브러리를 이용하려면 jar파일을 classpath에 추가해야 한다.
* 콘솔(명령 프롬프트 또는 터미널)에서 프로그램을 실행할 경우
- java 명령어를 실행할 때 -classpath로 제공
- CLASSPATH 환경 변수에 경로를 추가
* 이클립스 프로젝트에서 실행할 경우
- 프로젝트의 Build Path에 추가
my_lib 라이브러리 프로젝트 생성
Project name: my_lib
Module: [체크안함] Create module-info.java file (중요)
package pack1;
public class A {
public void method() {
System.out.println("A-method");
}
}
package pack2;
public class B {
public void method() {
System.out.println("B-method");
}
}
my_lib 오른쪽 버튼 -> [Export] 클릭 -> JAR file -> [Next] -> my_lib 체크 -> 폴더 및 이름 지정 -> [Finish]
my_application_1 프로젝트 생성
[File] -> [New] -> [Java Project] -> 입력 -> [Finish]
my_application_1 오른쪽버튼 -> [Build Path] -> [Libraries] -> [Classpath] -> [Add External JARs] -> jar 추가 -> [Apply]
라이브러리 파일 사용하기
콘솔에서 -classpath 옵션 사용
명령 프롬프트에서 현재 경로를 bin디렉토리로 이동하고 Main클래스를 실행하면 에러가 발생한다. my_lib.jar를 인식하지 못했기 때문이다.
=>-classpath로 파일 경로를 추가해서 실행해보면 원하는 결과가 출력된다.
모듈
모듈은 패키지 관리 기능까지 포함된 라이브러리이다. 일반 라이브러리는 내부에 포함된 모든 패키지에 외부 프로그램에서의 접근이 가능하지만, 모듈은 패키지를 은닉하여 접근할 수 없게끔 할 수 있다.
모듈은 모듈 기술자(module-info.java)에 의존 모듈을 기술할 수 있어 모듈 간의 의존 관계를 파악할 수 있다.
my_module_a, my_module_b 생성
Project name: my_module_a
Module: [체크] Create module-info.java file (중요)
Module name: my_module_a
Project name: my_module_b
Module: [체크] Create module-info.java file (중요)
Module name: my_module_b
my_application_2 생성
[File] -> [New] -> [Java Project] -> 입력 -> [Finish]
Project name: my_application_2
Module: [체크] Create module-info.java file (중요)
Module name: my_application_2
[my_application_2]오른쪽 버튼 -> [Build Path] -> [Configure Build Path] -> [Projects] -> Modulepath에 추가 -> [Apply]
패키지 은닉
모듈은 모듈 기술자(module-info.java)에서 exprts 키워드를 사용해 내부 패키지 중 외부에서 사용할 패키지를 지정한다.
exports 되지 않은 패키지는 자동적으로 은닉된다.
모듈이 일부 패키지를 은닉하는 이유
* 모듈 사용 방법 통일
- 모듈 외부에서 패키지2와 3을 사용하지 못하도록 막고, 패키지1로 사용 방법을 통일한다.
* 쉬운 수정
- 모듈 성능 향상을 위해 패키지2와 3을 수정하더라도 모듈 사용 방법(패키지1)이 달라지지 않기 때문에 외부에 영향을 주지 않는다.
전이 의존
다음과 같이 의존 관계를 변경한다고 가정해보자.
module my_application_2{
requires my_module_a;
}
module my_module_a{
exports pack1;
requires my_module_b;
}
my_application_2에서 my_module_b에 있는 C 클래스를 사용해야 한다면
"requires transitive my_module_b"를 반드시 추가해야 한다.
module my_module_a{
exports pack1;
requires transitive my_module_b;
}
'IT > JAVA' 카테고리의 다른 글
[JAVA] #12 java.base 모듈 (0) | 2023.04.20 |
---|---|
[JAVA] #11 예외 처리 (0) | 2023.04.19 |
[JAVA] #9 중첩 선언과 익명 객체 (0) | 2023.04.17 |
[JAVA] #8 인터페이스 (0) | 2023.04.14 |
[JAVA] #7 상속 (0) | 2023.04.11 |