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. 장점과 단점
장점
- 컴파일 타임에 모든 클래스의 정보를 불러올 필요가 없음으로(사실 불러올 수 조차 없습니다), 런타임 전까지 메모리가 낭비되는 것을 방지할 수 있습니다
단점
- 런타임 에러는 실행 시점에 가서야 알 수 있습니다 (이전에 캐치해내는 것이 불가능)
- 동적 로딩에 시간이 필요하기 때문에 프로그램 성능 저하로 이어질 수 있습니다.