Home [Java 프로그래밍] 15강 - 라이브러리와 모듈
Post
Cancel

[Java 프로그래밍] 15강 - 라이브러리와 모듈

💡해당 게시글은 방송통신대학교 김희천 교수님의 'Java 프로그래밍' 강의를 개인 공부 목적으로 메모하였습니다.



학습 개요


  • 라이브러리는 자주 사용 되는 공통의 Java 클래스를 묶어 .jar 파일 형태로 압축한 것임
  • 모듈 개념은 Java 9부터 도입 된 것으로 라이브러리의 발전 된 형태이며 패키지 별로 접근성을 제어할 수 있음
  • 개발 환경에서 라이브러리 또는 모듈을 제공하는 방법과 이것을 사용하는 방법을 학습함



학습 목표


  • 라이브러리로 사용 될 클래스를 개발하여 배포할 수 있음
  • .jar 형태의 라이브러리를 활용하는 프로그램을 작성할 수 있음
  • 모듈 프로젝트를 만들고, module-info.java 파일에 모듈을 정의할 수 있음
  • 모듈을 개발하여 제공하거나, 제공 된 모듈을 사용하여 프로그래밍 할 수 있음
  • Java 표준 모듈을 설명할 수 있음



강의록


라이브러리

라이브러리

  • 여러 프로그램에서 공통으로 사용될 수 있는 클래스와 인터페이스의 모음
    • 여러 .class 파일을 묶어 압축한 .jar 파일의 형태
    • 이때 유사한 클래스와 인터페이스는 묶어서 패키지로 구성됨

라이브러리 만들기

  • 자바 프로젝트 생성
    • 프로젝트 이름은 my_lib
      • module-info.java 파일은 만들지 않음
    • pack_a 패키지에 Member 클래스 작성
    • pack_b 패키지에 Student 클래스 작성
    • my_lib 프로젝트에 .jar 파일을 저장할 dist 폴더 생성
  • .jar 파일 만들기
    • Export… → JAR file
      • .class 파일이 포함됨
    • 파일은 my_lib/dist/my_lib.jar

라이브러리 사용 하기

  • 자바 프로젝트 생성
    • 프로젝트 이름은 UseMyLibExample
      • module-info.java 파일은 만들지 않음
    • LibraryExample 패키지에 Main 클래스와 main() 메소드 작성
  • 라이브러리 추가 하기
    • 프로젝트의 팝업 메뉴에서 Build Path → Configure Build Path… → Java Build Path → Libraries 탭 → Classpath 선택 → Add External JARs… 버튼 클릭
    • 이전에 만든 my_lib.jar 파일을 선택하고 Apply and Close
      • Add External JARs…은 외부에서 받은 .jar를 포함 시킬 때 사용
      • Add JARs…은 작업 공간에 있는 .jar를 포함 시킬 때 사용
  • main() 메소드에서 라이브러리의 public 클래스 사용하기
    • import 구문을 사용할 수 있음

    image

    image

모듈

모듈

  • 자바 라이브러리의 업그레이드 버전
    • Java 9부터 모듈 시스템을 도입
  • 패키지가 클래스의 묶음이라면, 모듈은 패키지의 묶음
    • 모듈은 특별한 기능을 담당하는 프로그램으로, 관련 패키지를 묶어 모듈 단위로 캡슐화 했으며, 다른 모듈을 사용할 수 있으며, 일부 패키지를 공개 패키지로 노출
  • 패키지 단위의 접근 제한을 설정할 수 있음
    • 기본적으로 모듈 내의 패키지는 외부(다른 모듈)에 공개 되지 않음
  • 자바 프로젝트에서 module-info.java 파일에 모듈에 대한 정보를 기술

모듈 정의

  • module-info.java
    • 파일에 모듈의 이름과 모듈 간의 관계를 기술함
    • 자바 모듈 프로젝트의 src 폴더에 위치함
      • 배포 과정에서는 .jar 파일에서 루트 폴더에 위치함
    • module descriptor 파일이라고 함
    • 모듈의 이름, 모듈이 requires하는 다른 모듈(의존성), 모듈이 exports하는 패키지(공개 API)를 명시

      1
      2
      3
      
        module my_mod_a {
            requires my_mod_b;
        }
      
      1
      2
      3
      4
      
        module my_mod_b {
            exports package_a;
            exports package_b;
        }
      

모듈을 제공하는 프로젝트

  • 모듈을 제공하는 자바 프로젝트 생성
    • 프로젝트 이름은 my_mod_a
    • 프로젝트 생성 시 module-info.java 파일을 생성
      • 나중에 만들려면 프로젝트 팝업 메뉴에서 configure 실행
    • pack_a 패키지에 Member 클래스 작성
    • pack_b 패키지에 Student 클래스 작성
    • 프로젝트 이름은 my_mod_b
    • 프로젝트 생성 시 module-info.java 파일을 생성
    • pack_c 패키지에 Triangle 클래스 작성
    • pack_d 패키지에 Circle 클래스 작성

모듈을 사용하는 프로젝트

  • 모듈을 사용하는 자바 프로젝트 생성
    • 프로젝트 이름은 MyProject
    • 프로젝트 생성 시 module-info.java 파일을 생성
    • TestModule 패키지에 Main 클래스와 main() 메소드 작성
    • 프로젝트의 팝업 메뉴에서 Build Path → Configure Build Path… 선택 → Projects 탭 → Modulepath 선택 → Add… 버튼 클릭
      • 모듈을 사용하려면 Classpath가 아닌 Modulepath에 추가해야 함
    • 사용할 모듈 프로젝트로 my_mod_a와 my_mod_b를 선택하고 Apply

모듈을 만들고 정의하기

  • 모듈 프로젝트에서 module-info.java 파일을 작성
    • 기본적으로 모듈의 이름은 프로젝트 이름과 같음
    • my_mod_a 모듈

      1
      2
      3
      4
      
        module my_mod_a {
        	exports pack_a;
        	exports pack_b;
        }
      
    • my_mod_b 모듈

      1
      2
      3
      4
      
        module my_mod_b {
        	exports pack_c;
        	exports pack_d;
        }
      
    • MyProject 모듈

      1
      2
      3
      4
      
        module MyProject {
        	requires my_mod_a;
        	requires my_mod_b;
        }
      
  • exports 패키지
    • 프로젝트의 패키지를 다른 모듈에서 사용할 수 있게 외부에 제공함을 의미
    • 기본적으로 public 클래스도 모듈 외부에 공개되지 않기 때문에 공개하려면 exports 해야 함
  • requires 모듈
    • 프로젝트에서 해당 모듈이 제공한 패키지를 사용(의존)하겠다는 의미
    • 이러한 선언이 있어야 import 가능함

모듈 사용하기

  • main() 메소드에서 외부 모듈이 제공한 패키지 사용하기

    image

    image

모듈 간의 의존 관계

  • requiresexports
    • requires 키워드는 해당 모듈(A)이 다른 모듈(B)에 의존함을 선언
    • 아래는 모듈 A가 모듈 B가 제공(exports)하는 패키지를 사용한다는 의미

      1
      2
      3
      
        module A {
            requires B;
        }
      
    • 모듈 간 의존 관계

      image

  • requires transitive
    • 모듈이 다른 모듈에 의존함을 표현하며, 현 모듈을 사용하는 모든 모듈에 의존성을 전파함. 즉, 자동으로 의존 관계가 추가 됨
    • MyProject에서 pack_c와 pack_d를 사용할 수 있음

      1
      2
      3
      
        module A {
            requires transitive B;
        }
      
    • 모듈 간 의존 관계의 전이

      image

Java 표준 모듈

Java 표준 모듈

  • Java 9부터 모듈 개념이 도입됨
  • 자바 표준 라이브러리가 모듈화 됨
    • java.xxx 모듈을 표준 모듈 또는 플랫폼 모듈이라 함
  • java.base 모듈
    • 자바 플랫폼에서 가장 기본이 되는 모듈
      • 어떤 모듈에도 not dependent, 다른 모듈은 java.base에 dependent
    • java.base 모듈을 사용하기 위해, requires 키워드로 사용 선언을 하지 않아도 됨
    • java.lang, java.math, java.net, java.io, java.nio, java.util 등의 패키지를 포함
      • java.lang은 import 하지 않아도 됨

표준 모듈의 사용

  • module-info.java 파일
    • 자바 프로젝트에서 이 파일을 사용하고, java.base 모듈 내에 없는 패키지를 사용해야 한다면, requires 키워드를 사용하여 명시적 선언을 해야 함
  • 프로그래밍에서 java.sql 패키지를 import하여 사용하는 경우
    • java.sql 패키지는 java.sql 모듈에서 exports 하고 있음
    • 따라서 프로젝트에서 java.sql 모듈을 requires 해야 함

    image



학습 정리


  • 자주 사용 되는 클래스와 인터페이스를 컴파일 된 형태로 제공한 것을 라이브러리라고 함
  • Java의 라이브러리는 .class 파일을 묶어서 만든 .jar 파일의 형태임
  • 모듈은 라이브러리의 업그레이드 버전으로 패키지 단위에서 접근성을 설정할 수 있음
  • 라이브러리를 사용하려면 해당 .jar 파일을 Classpath에 추가하고, 모듈을 사용하려면 Modulepath에 추가함
  • 모듈 프로젝트에서 module-info.java 파일에 export 패키지; 또는 requires 모듈; 형식으로 모듈 간 의존 관계를 설정할 수 있음
  • JDK의 표준 라이브러리는 모두 모듈화 되었으며, java.base는 자바 표준 모듈 중 가장 기본 모듈임



연습 문제


  1. .jar 파일 형식으로 배포 된 라이브러리를 사용하고자 할 때, 이러한 .jar 파일을 어떤 환경 변수에 추가해야 하는가?

    a. Classpath

  2. Java의 표준 모듈 중 requires 키워드로 사용 선언을 하지 않아도 사용 가능한 모듈은 무엇인가?

    a. java.base

  3. java.sql 모듈에서 제공하는 java.sql 패키지가 있으며, 여기에 포함 된 클래스(또는 인터페이스)를 사용하는 모듈 프로젝트가 있을 때, module-info.java 파일에서 아래 밑줄 부분에 들어가야 할 내용은?

    1
    2
    3
    
     module com.mymodule.app {
     				// _____________
     }
    

    a. requires java.sql;

[데이터 정보 처리 입문] 14강 - 파이썬을 활용한 자료 분석

[파이썬 프로그래밍 기초] 15강 - 체크 포인트