앞 포스팅에서 Class Loader에 대해서 설명했다.
Class Loader는 간단히 얘기하면 class 파일들을 동적으로 로드하고, 메모리 영역(Runtime Data Areas)으로 올려주는 역할을 한다.

그러면 class loader가 자바 클래스들을 메모리에 언제 올리는지 알아보겠다.
JVM은 실행 될 때 모든 클래스를 메모리에 올려놓지 않는다.
그때마다 필요한 클래스를 메모리에 올려 효율적으로 관리한다.
그러면 static 멤버들은?
static 멤버들도 한번에 메모리에 올라가지 않는다. 언제 어디서 사용될지 모르는 static 멤버들을 처음에 전부 메모리에 올린다는건 비효율적이기 때문에, 클래스 내의 멤버를 호출하게 되면 그때서야 클래스가 동적으로 메모리에 로드된다.
각 상황에 따라 클래스 로드 시점을 알아보겠다.
클래스가 이렇다고 가정해보자
class Outer {
static String value="> Outer 클래스의 static 필드입니다.";
static final String VALUE="> Outer 클래스의 static final 필드입니다.";
Outer() { System.out.println("> Outer 생성자 초기화");}
static void getInstance() {
System.out.println("> Outer 클래스의 static 메서드 호출");
class Inner {
Inner() { System.out.println("> Inner 생성자 초기화"); }
static class Holder {
static String value="> Holder 클래스의 static 필드입니다.";
static final String VALUE="> Holder 클래스의 static final 필드입니다.";
Holder() { Sytem.out.println("> Holder 생성자 초기화"); }
}
}
public class Main {
public static void main(string[] args){
}
}
public class Main {
public static void main(string[] args){
new Outer();
}
}
public class Main {
public static void main(string[] args){
System.out.println(Outer.value);
}
}
public class Main {
public static void main(string[] args){
System.out.println(Outer.VALUE);
}
}
public class Main {
public static void main(string[] args){
Outer.getInstance();
}
}
public class Main {
public static void main(string[] args){
new Outer().new Inner();
}
}
public class Main {
public static void main(string[] args){
new Outer().Holder();
}
}
public class Main {
public static void main(string[] args){
System.out.println(Outer.Holder.value);
}
}
이렇게 class loader의 로드 시점에 대해 알아보았다.
다음 포스팅에서는 class loader 다음 단계인 Runtime Area에 대해 올리도록 하겠다.