공부/Java

[Java] 자바에서 말하는 라이브러리와 자바 표준 모듈 개념 정리 (Java.lang import 필요없는 이유)

ByeongJun 2023. 4. 10. 11:22
반응형

라이브러리(Library)

프로그램 개발 시 활용할 수 있는 클래스와 인터페이스들을 모아놓은 것을 의미

 

출처 : <이것이 자바다(개정판)>

JAR 파일에는 클래스와 인터페이스의 바이트코드 파일(~.class)들이 압축되어 있는데 

특정 클래스와 인터페이스가 여러 응용프로그램을 개발할 때 공통으로 자주 사용된다면

JAR 파일로 압축해 라이브러리로 관리하는 것이 좋다.

 

라이브러리를 사용하려면 라이브러리 JAR 파일을 ClassPath(클래스를 찾기 위한 경로)에 추가해야 한다.

 

[Build Path 설정창 여는 방법 1]

프로젝트 선택  Build path Configure Build Path

 

 

 

[Build Path 설정창 여는 방법 2]

프로젝트 선택  Properties → 'type filter text' 창에 Java Build Path 검색 또는 선택

 

 

 


모듈(Module)

패키지 관리 기능까지 포함된 라이브러리로써 Java 9부터 지원한다.

 

일반 라이브러리는 내부에 포함된 모든 패키지에 외부 프로그램에서의 접근이 가능하지만, 

모듈은 일부 패키지를 은닉하여 접근할 수 없게끔 할 수 있다는 특징이 있다.

 

모듈은 자신이 실행할 때 필요로 하는 의존 모듈을 모듈 기술자(module-info.java)에 기술할 수 있어

모듈 간의 의존 관계를 쉽게 파악할 수 있다.

 

모듈도 라이브러리이기 때문에 JAR 파일 형태로 배포할 수 있다.

모듈화해서 개발할 경우 개발하고 조립하는 방식이기 때문에 재사용성 및 유지보수에 유리하다.

 

 

 

자바 표준 모듈

자바 프로그램이라면 JDK가 제공하는 표준 라이브러리를 반드시 활용해야 한다. 

 

Java 17의 전체 모듈 그래프 이미지를 소개된 URL에서 가져왔는데

어떻게든 이해해보려 <이것이 자바다(개정판)> 내용을 꾸역꾸역 설명해보자면, 

 

java.base는 모든 모듈이 존재하는 기본 모듈이다. 

requires 하지 않아도 사용할 수 있지만, 다른 모듈들은 모듈 기술자에 requires를 명시하고 사용해야 한다. 

 

java.base는 모든 모듈이 존재하는 반면,

의존 관계에 있는 다른 모듈들은 자식 개념으로 보고 requires를 명시해야한다는 의미로 보여진다.

 

java.base 모듈에는 java.lang, java.util, java.io 등의 핵심 패키지가 있으며 

import 해서 사용 가능하다! (java.lang은 제외)

 

더보기

Java lang 패키지는 자바 프로그래밍에서 필수적인 가장 기본적인 클래스들이 모여있는 패키지이다. 

 

import 구문으로 호출해야 사용할 수 있는 다른 패키지들과는 달리 자동으로 프로그램에 포함된다.

lang 패키지에 포함되는 클래스는 따로 명시하지 않아도 최상위 클래스가 된다. 


[ lang 패키지에 포함되는 클래스 ]

  • String class
    - 문자열 데이터를 관리하는데 사용되는 클래스
    - 한 번 String에 저장되면 데이터는 고정되어 수정이 불가한 불변 클래스(immutable class)
  • StringBuffer class
    - String 같이 문자열 관리에 이용되는 클래스로, 수정 가능한 가변 클래스(mutable class)
    - 크기가 자동으로 조절되는 Buffer 제공, 내부적으로 버퍼라는 독립적인 공간을 갖고 크기 기본 값은 16
    - append() 메소드를 통해 문자열 결합시 자기 주소를 반환해 메모리 낭비가 없고 String 클래스에 비해 빠르다.
                     인수로 전달된 값을 문자열로 변환 후 해당 문자열의 마지막에 추가하며 자신의 주소를 반환한다.
  • Wrapper class
    - 기본형을 객체처럼 다룰 수 있게 해주는 클래스 (형변환 메소드들을 포함)
      parseInt() : String을 기본 자료형으로 변환   /   valueOf() : 기본형을 String으로 변환
  • System class
    - 운영체제 시스템과 관련된 기능을 제공하는 클래스
    - 모든 멤버가 기본 static이기 때문에 별도의 인스턴스 생성할 필요가 없다.
  • Stream class
    - 입력 장치나 출력장치를 프로그램과 연결해주는 역할 (Java의 모든 입출력은 Stream을 통해 이뤄진다)
  • Class class
    - 클래스와 관련된 여러 정보를 탐색할 수 있는 클래스
      forName() : 파라매터로 넘어온 클래스명의 객체를 찾아 class 클래스를 반환
      genName() : 객체의 클래스명을 반환

      newInstance() : 객체의 클래스 인스턴스를 생성하여 반환

 

출처 : http://www.incodom.kr/Java/java.lang / JAVA 핵심 요약 노트 (김흥래/한빛미디어)


 

 

 

 

 

java.se는 JDK가 제공하는 모든 모듈을 제공하는 집합 모듈이다.

Java 8 이전 버전과 같이 자바 표준 라이브러리를 제한 없이 사용하고 싶을 경우에 requires하면 된다. 

 

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

module my_app {
	requires java.se;
}

 

 

 

Java 8 이전 버전까지는 응용프로그램이 표준 라이브러리의 5%만 사용하는데도

전체 표준 라이브러리가 갖춰진 자바 실행 환경(JRE)이 필요했다. 

 

표준 라이브러리를 모듈화한 이유는 응용프로그램을 실행하는데 필요한 모듈만으로 구성된

작은 사이즈의 자바 실행 환경(JRE)을 만들기 위해서라고 한다. 

반응형