이것이 자바다 - Part 10

mj·2023년 1월 18일
0
post-thumbnail

Part 10 라이브러리와 모듈

라이브러리

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

프로그램 개발 시 라이브러리를 이용하려면 라이브러리 JAR 파일을 ClassPath에 추가해야 한다.
ClassPath란 말 그대로 클래스를 찾기 위한경로이다.

ClassPath에 라이브러리 추가

  • 콘솔(명령 프롬프트 또는 터미널)에서 프로그램을 실행할 경우
    • java 명령어를 실행할 때 -classpath로 제공
    • CLASSPATH 환경 변수에 경로를 추가

모듈

Java 9 부터 지원하는 모듈은 패키지 관리 기능까지 포함된 라이브러리이다.
일반 라이브러리는 내부에 포함된 모든 패키지에 외부 프로그램에서의 접근이 가능하지만, 모듈은 일부 패키지를 은닉하여 접근할 수 없게끔 할 수 있다.

또 다른 차이점은 모듈은 자신이 실행할 때 필요로 하는 의존 모듈을 모듈 기술자에 기술할 수 있기 때문에 모듈 간의 의존 관계를 쉽게 파악할 수 있다는 것이다.

응용프로그램 모듈화

응용프로그램은 하나의 프로젝트로도 개발이 가능하지만, 이것을 기능별로 서브 프로젝트(모듈)로 쪼갠 다음 조합해서 개발할 수도 있다.

응용프로그램의 규모가 커질수록 협업과 유지보수 측면에서 서브 모듈로 쪼개서 개발하는 것이 유리하며, 이렇게 개발된 모듈들은 다른 응용프로그램에서도 재사용 가능하다.

패키닉 은닉

모듈은 모듈 기술자(module-info.java)에서 exports 키워드를 사용해 내부 패키지 중 외부에서 사용할 패키지를 지정한다.
exports 되지 않은 패지키는 자동적으로 은닉된다.

집합 모듈

집합 모듈은 여러 모듈을 모아놓은 모듈을 말한다.
자주 사용되는 모듈들을 일일이 require하는 번거로움을 피하고 싶을 때 집합 모듈을 생성하면 편리하다.
집합 모듈은 자체적인 패키지를 가지지 않고, 모듈 기술자에 전의 의존 설정만 한다.

리플렉션 허용

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

리플렉션

  • 실행 도중에 타입(클래스, 인터페이스 등) 을 검사하고 구성 멤버를 조사하는 것을 말한다.

경우에 따라서는 은닉된 패키지도 리플렉션을 허용해야 할 때가 있다.
모듈은 모듈 기술자를 통해 모듈 전체 또는 지정된 패키지에 대해 리플렉션을허용할 수 있고, 특정 외부 모듈에서만 리플렉션을 허용할 수도 있다.

  • 모듈 전체를 리플렉션 허용
open module 모듈명 {
	...
}
  • 지정된 패키지에 대해 리플렉션 허용
module 모듈명 {
	...
    opens 패키지1;
    opens 패키지2;

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

export된 패키지는 언제든지 리플렉션이 가능하므로 opens로 지정할 필요가 없다. opens는 은닉된 패키지 중에서 특정 패키지에 대한 리플렉션을 허용한다.

자바 표준 모듈

자바 프로그램이라면 반드시 활용해야 하는 라이브러리가 있다. 바로 JDK가 제공하는 표준 라이브러리이다.
표준 라이브러리는 Java9 부터 모듈화 되어 Java17 표준 모듈이 완성되었다.

java.base 는 모든 모듈이 의존하는 기본 모듈이다. java.base 모듈은 require 하지 않아도 사용할 수 있지만, 다른 모듈들은 모듈 기술자에 requires를 명시하고 사용해야 한다.

java.se 는 JDK가 제공하는 모든 모듈을 제공하는 집합 모듈이다.
Java8 이번 버전과 같이 자바 표준 라이브러리를 제한 없이 사용하고 싶을 경우에는 이 java.se를 requires 하면 된다.

module my_application {
	requires java.se;
}

또 다른 방법은 thisisjava 프로젝트처럼 모듈 기술자가 없는 프로젝트를 만드는 것이다.
모듈 기술자가 없으면 모듈로 인식되지 않기 때문에 자바 표준 라이브러리를 제한 없이 사용할 수 있다.

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

작은 사이즈의 자바 실행 환경이 필요한 경우는 다음과 같다.

  • 독립 실행형(응용프로그램 + 표준 라이브러리)으로 배포할 경우 표준 라이브러리의 크기가 작을수록 배포 사이즈가 줄어든다.
  • 제한된 자원만 가지고 있는 소형(임베디드) 기기에는 사이즈가 작은 자바 실행 환경이 필요하다.

문제

  1. 자바 라이브러리에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ 일반적으로 JAR(~.jar) 파일 형태로 존재한다.
    ➋ JAR 파일 안에는 클래스 및 인터페이스의 소스 파일이 있다.
    ➌ 라이브러리에 포함된 모든 패키지는 프로그램에서 접근이 가능하다.
    ➍ 이클립스 프로젝트에서 사용할 경우 Build Path에 JAR 파일을 추가한다.
  • 답 : ➋
  1. 모듈에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ 모듈은 패키지 관리 기능까지 포함된 라이브러리라고 볼 수 있다.
    ➋ 모듈에 포함된 일부 패키지는 은닉해서 접근할 수 없도록 할 수 있다.
    ➌ 모듈은 모듈 기술자가 반드시 존재할 필요는 없다.
    ➍ 모듈도 라이브러리이므로 JAR 파일 형태로 배포될 수 있다.
  • 답 : ➌
  1. 모듈 기술자(module-info.java)에 기술되는 내용으로 틀린 것은 무엇입니까?
    ➊ exports는 외부에서 접근할 수 있는 패키지를 기술한다.
    ➋ requires는 의존 모듈을 기술한다.
    ➌ requires를 기술할 때에는 exports를 기술할 수 없다.
    ➍ transitive는 전이 의존 모듈을 기술한다.
  • 답 : ➌
  1. 집합 모듈에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ 한 번의 의존 설정으로 여러 모듈을 사용할 수 있도록 해준다.
    ➋ 집합 모듈 기술자에는 requires transitive로 의존 모듈을 기술한다.
    ➌ 집합 모듈 기술자에는 requires transitive로 다른 집합 모듈을 기술할 수 있다.
    ➍ 집합 모듈을 의존 설정할 경우에는 다른 모듈을 의존 설정할 수 없다.
  • 답 : ➍
  1. 자바 표준 모듈에 대한 설명으로 틀린 것은 무엇입니까?
    ➊ java.base 모듈은 기본 모듈이므로 requires하지 않아도 사용할 수 있다.
    ➋ java.base 모듈에 속한 패키지는 import 없이도 사용할 수 있다.
    ➌ java.se 모듈은 JDK의 전체 모듈을 사용할 수 있도록 구성된 집합 모듈이다.
    ➍ 자바 표준 모듈은 작은 자바 실행 환경을 만들기 위해 설계되었다
  • 답 : ➋
profile
사는게 쉽지가 않네요

0개의 댓글