Language/JAVA

[이것이 자바다].ch9.라이브러리

JSJH._. 2025. 12. 28. 15:34

[이것이 자바다] 09. 라이브러리

안녕하세요. 이번에는 자바의 라이브러리와 모듈에 대해 정리한 내용입니다.
이 부분도 매우 중요합니다. 사실 개발은 자기가 전부 만드는것보다는 남이 만든것을 가져다가 사용하는것이 대부분이죠. 그리고 그렇게 도움받고 도움주면서 코딩 생태계가 이렇게 커졌다고 생각합니다.


1. 라이브러리(Library)

  • 프로그램 개발에 바로 가져다 쓸 수 있는 클래스와 인터페이스들의 묶음입니다.
    • 이미 만들어진 라이브러리를 활용 복잡한 기능을 쉽고 빠르게 구현 가능합니다.
  • JAR (Java ARchieve) 파일
    • 라이브러리는 보통 .jar라는 압축 파일 형태로 제공됩니다.
    • 파일 안에는 클래스와 인터페이스의 바이트코드(.class 파일)들이 압축되어 있습니다.
  • Classpath (클래스패스)
    • JAR 파일의 위치를 알려주는 경로입니다.
    • 콘솔 실행 시: java -classpath 옵션으로 직접 경로 지정하거나 CLASSPATH 환경 변수에 경로 추가합니다.
    • IDE (이클립스 등) 사용 시: 프로젝트의 Build Path 설정에 라이브러리 JAR 파일을 추가합니다.

2. 모듈(Module)

  • 단순한 클래스 묶음을 넘어 패키지 관리 기능까지 포함된, 더 발전된 형태의 라이브러리입니다.
    • .jar 파일 형태이지만, 내부에 모듈 기술자(module-info.java) 포함합니다.
구분 일반 라이브러리 (JAR) 모듈 (Modular JAR)
접근 제어 포함된 모든 패키지가 외부에 공개 특정 패키지를 은닉(encapsulate) 외부 접근을 막을 수 있음.
의존성 어떤 라이브러리에 의존하는지 파악하기 어려움. 모듈 기술자에 필요한 의존 모듈을 명시, 관계 파악이 쉬움.

모듈의 핵심 기능: 모듈 기술자(module-info.java)

  • 모듈의 모든 설정은 프로젝트 최상단에 위치하는 module-info.java 파일에 기술합니다.

패키지 공개 및 은닉 exports

  • exports 키워드 사용 >> 외부에 공개할 패키지를 명시적으로 지정 >> 다른 곳에서 사용 가능합니다.
    • exports 되지 않은 패키지는 자동 은닉됩니다.
  • 은닉 이유
    • 사용 방법 통일: 의도한 특정 패키지로만 외부에서 접근하도록 강제, 모듈의 사용법 통일합니다.
    • 쉬운 유지보수: 내부용 패키지를 자유롭게 수정하거나 개선해도, 공개된 패키지만 유지된다면 모듈을 사용하는 다른 프로젝트 영향 없습니다.

의존성 설정 requires

  • requires
    • 내 모듈이 다른 모듈의 기능을 사용하기 위해, 어떤 모듈에 의존하는지 명시합니다.
  • requires transitive (전이 의존)
    • 내 모듈(A)이 의존하는 다른 모듈(B)을, 내 모듈(A)을 사용하는 쪽(C)에서도 추가 설정 없이 바로 사용 가능합니다.
    • 집합 모듈: 여러 모듈을 하나로 묶어 제공할 때, 다른 모듈들의 의존성 설정만으로 구성합니다.

리플렉션 허용 opens

  • 리플렉션: 코드의 타입(클래스, 인터페이스)을 들여다보고 구조를 분석하는 기술입니다.
  • open module ...
    • 모듈 전체의 리플렉션 허용합니다.
  • opens package;
    • 특정 패키지만 리플렉션을 허용합니다.
  • opens package to module;
    • 특정 외부 모듈에게만 리플렉션을 허용합니다.

자바 표준 모듈

  • 모듈화 목적
    • 필요한 모듈만으로 구성된 가볍고 작은 사이즈의 자바 실행 환경(JRE) 생성합니다.
  • 주요 표준 모듈
    • java.base
      • 모든 모듈이 의존하는 가장 기본적인 모듈, requires 하지 않아도 자동으로 사용 가능합니다.
    • java.se
      • JDK가 제공하는 모든 표준 모듈을 포함하는 집합 모듈입니다.

핵심 포인트

  • 라이브러리(JAR)
    • 단순히 클래스를 모아놓은 도구 상자입니다.
  • 모듈
    • 패키지를 숨길 수 있고(exports), 의존 관계를 명시할 수 있는(requires) 시스템화된 도구 상자입니다.
  • exports (공개 설정)
    • 모듈의 패키지는 기본적으로 은닉, exports로 지정한 것만 외부에서 사용 가능합니다.

감사합니다.