Java - 심화 : 동적 로딩

Seok-Hyun Lee·2021년 7월 20일
0

JAVA

목록 보기
17/21

동적 로딩

동적 로딩(Dynamic Loading)이란 JVM을 기반으로 하는 언어들의 공통적인 특징이다. 이번 포스트에서는 이 동적 로딩에 대한 개념을 다룬다.

JVM 과 자바 애플리케이션

자바 애플리케이션이 어떻게 JVM 상에서 구동되는지를 요약하면 JVM의 클래스로더가 실행중에 필요한 .class 파일을 Runtime Data Areas에 로드하고 Execution Engine이 바이트코드를 실행한다.

이때, .class 파일은 자바 컴파일러에 의해 .java가 바이트코드로 컴파일이된 파일이다. 즉, 이번 포스트에서 다룰 부분은 JVM 의 클래스로더이다.

클래스로더

클래스로더의 역할은 실행중에 필요한 .class 파일을 메모리에 로드시키는 것이다. 그리고 이를 위해 클래스로더는 다양한 특징을 가지고 있다.

  • 계층 구조 :내부적으로 계층 구조
  • 델리게이션(위임) 모델 :상위 클래스로더에 필요한 클래스 정보가 있으면 로드를 위임, 없으면 로드를 요청받은 자신이 로드
  • 가시성(Visibility) 제한 : 하위 클래스로더는 델리게이션(위임)을 통해 부모 클래스로더가 로딩한 클래스를 찾을 수 있지만 반대는 불가능
  • Unload 불가 : 클래스로더에 의해 로딩된 클래스는 해당 클래스로더가 삭제될 때까지 언로드 불가

위임 모델인 계층 구조에 대해 자세히 보면 아래와 같다.

  • 부트스트랩 클래스 로더: JVM을 기동할 때 생성되며, Object 클래스들을 비롯하여 자바 API들을 로드한다. 다른 클래스 로더와 달리 자바가 아니라 네이티브 코드로 구현되어 있다.
  • 익스텐션 클래스 로더(Extension Class Loader): 기본 자바 API를 제외하고 보안 확장 기능 등 다양한 확장 클래스들을 로드한다.
  • 시스템 클래스 로더(System Class Loader): 상위 클래스로더들이 JVM 자체의 구성 요소들을 로드하는 것이라 한다면, 시스템 클래스 로더는 애플리케이션 레벨에서 사용자가 지정한 $CLASSPATH 내의 클래스들을 로드한다.
  • 사용자 정의 클래스 로더(User-Defined Class Loader): 애플리케이션 코드 상에서 사용자가 직접 생성해서 사용하는 클래스 로더이다.

즉, 우리 클래스 파일은 항상 메모리에 로드되어 있는 것이 아니라 클래스로더의 내부적인 구조와 위임 정책에 의해 동적으로 로딩되는 것을 알 수 있다. 이로 인한 장점은 아래와 같다.

  • 컴파일 타임에 모든 클래스의 정보를 알 필요가 없다.
  • 동적 로딩을 통해 외부 플러그인 확장 및 사용에 용이
  • 실행에 필요한 정보만을 메모리에 로드할 수 있다.

하지만 동적 로딩으로 인한 단점도 있으니 알아둬야 한다.

  • 런타임 에러를 알 수 없다.
  • 프로그램 실행 속도 저하, 메모리에 미리 로드되어 있지 않기 때문(Static 사용 이유)
profile
Arch-ITech

0개의 댓글