Java의 동적 로딩(Dynamic Loading)

4410 단어 JavaJava

1. 흔히 언급되는 자바 언어의 장점

출처에 따르면, 자바 언어의 장점은 크게 다음과 같습니다

  • 운영체제에 독립적이다
  • 객체지향 언어이다
  • 자동으로 메모리 관리를 해준다
  • 오픈소스이다
  • 멀티스레드를 쉽게 구현할 수 있다
  • 동적 로딩을 지원한다

본 포스트에서는 이 중 동적 로딩에 대해 정리해보려고 합니다


2. 클래스 로더

동적 로딩에 대해 알기 위해서는 먼저 JVM의 구조와 클래스 로더에 대해 이해하고 넘어갈 필요가 있습니다

출처 : 위키백과 - 자바 가상 머신

  • 위에서 보시는 바와 같이, JVM은 자바 컴파일러에 의해 생성된 바이트코드(.class)를 클래스 로더를 통해 불러옵니다
  • 클래스 로더는 바이트코드로부터 실제 객체를 생성합니다. 위 그림과 같이 메모리에 인스턴스 올리는, 즉 클래스의 인스턴스화를 수행하는 것이 바로 클래스 로더입니다

3. 동적 로딩

레퍼런스 :
자바캔님의 블로그 - 클래스로더 1, 동적인 클래스 로딩과 클래스로더
suji95님의 블로그 - JVM 동적 클래스 로딩

1_ 로드타임 동적 로딩 (Load-time dynamic loading)

public class Main {
	public static void main(String[] args) {
    	System.out.println("hello world");
    }
}

위에서 Main 클래스를 실행했을 때 클래스 로더는 다음과 같은 일들을 수행합니다 (컴파일 이후 시점입니다)

  • Object 클래스를 읽어온다 (Object 클래스는 모든 클래스가 상속하기 때문)
  • Main.class 파일을 읽는다
  • Main.class 파일을 로딩하기 위해 필요한 java.lang.String, java.lang.System 클래스를 로딩합니다

여기서 java.lang.String, java.lang.System은 Main 클래스를 로딩하는 과정에서 로드타임에 동적으로 로딩됩니다

2_ 런타임 동적 로딩 (Run-time dynamic loading)

앞서 인터페이스의 다형성에 대해서 알아보았던 포스트의 내용을 조금 가져다 쓰도록 하겠습니다

interface AnimalIntegerface {
	void sound();
}
//
public listenAnimalSound(AnimalInterface i) {
	i.sound(); 
}
  • 자바의 인터페이스 다형성은 프로그래머로 하여금 선언부와 구현부를 나누어 프로그래밍 할 수 있게 해줍니다
  • 위에서 listenAnimalSound()에서 변수로 입력되는 인터페이스 (실제로는 AnimalInterface를 구현한 클래스만이 변수로 입력될 수 있습니다)는, 메소드가 실행되기 전까지는 어떤 클래스가 들어올지 알 수 없습니다
  • 즉, 로드타임에 로딩할 수 없습니다
  • 따라서 이는 메서드가 실행되는 순간인 런타임에 동적으로 로딩되게 됩니다!

3. 장점과 단점

장점

  • 컴파일 타임에 모든 클래스의 정보를 불러올 필요가 없음으로(사실 불러올 수 조차 없습니다), 런타임 전까지 메모리가 낭비되는 것을 방지할 수 있습니다

단점

  • 런타임 에러는 실행 시점에 가서야 알 수 있습니다 (이전에 캐치해내는 것이 불가능)
  • 동적 로딩에 시간이 필요하기 때문에 프로그램 성능 저하로 이어질 수 있습니다.

좋은 웹페이지 즐겨찾기