JAVA의 클래스로더는 JVM이 작동되는데 있어 아주 중요한 역할을 한다. 이전에 이야기했던 JVM의 대략적 설명을 보면 Compiler는 바이트 코드 단위로 우리의 코드를 JVM에 전달한다. ExecutionEngine이 이 바이트 코드를 각자 읽으면, ( ExecutionEngine 정리) 우리가 작성한 코드들이 실행된다. 이때 필요한 클래스를 로드해주는 존재가 클래스로더다.
컴파일러를 통해 바이트코드 단위로 변경된 즉 클래스파일들은 클래스패스 내 디렉토리, JAR 파일 내부, 웹 애플리케이션 WAR 파일 내부 등에 있다. 네트워크에 있을 때도 있다. 이런 파일들을 클래스로더는 JVM이 필요하다고 하는 시점에 동적으로 로드해준다. 이 부분이 가장 재밌는 부분이다.
ClassLoader는 여러가지이다. 위에서 나온 이야기들만 봐도, 기본적인 세 가지 클래스로더와 이것들이 각각 상속받는 클래스로더들 등등 여러가지가 더 있다. 이렇게 보면 클래스 로더가 그냥 클래스 로딩해주는 것 정도이긴 하지만, 이 안에 내부적으로 더 세세한 규칙들이 있다. 위임 법칙, 가시성 법칙, 유일성 법칙 등등이 있다.
DelegationPrinciple(위임 법칙)
VisibilityPrinciple(가시성 법칙)
UniquenessPrinciple(유일성 법칙)
위임 원칙은 클래스 로딩이 필요할 때 3가지 기본 클래스로더의 윗 방향으로 클래스 로딩을 위임하는 것을 말한다. 제일 먼저 찾기 시작하는 클래스로더는 Bootstrap ClassLoader이다. 해당 Classloader를 시작으로 하위로 한 단계씩 내려가면서 찾는다. 자바의 상속과 약간 비슷한 느낌이 들긴 하지만, 목적이 아예 다르고 사용하는 것도 아예 다르니 굳이 비교하지 말고 각각으로 이해하는 게 좋을 것 같다.
가시범위 원칙은 하위 클래스로더는 상위 클래스 로더가 로딩한 클래스를 볼 수 있지만, 상위 클래스로더는 하위 클래스로더가 로딩한 클래스를 볼 수 없다는 원칙이다. 이렇게 해야 하위 클래스에서 Object에 접근하는 것이 가능하기 때문이다. 역시 객체지향이다 싶었다. 자바의 객체지향에서 상속은 하위는 super()를 통해 상속받은 부모의 내부를 볼 수 있지만, 부모 클래스는 하위 클래스를 볼 수 없다. 이런 내용이 ClassLoader에서도 영향을 준게 아닐까 싶다.
유일성 법칙은 상위 클래스로더에서 로드한 클래스를 하위 클래스로더에서 로드하면 안된다는 법칙이다. 클래스를 로드하는 일은 가능한한 상위 클래스로더에게 위임하는 것이 이 유일성 법칙과도 연결되어 있는듯 싶다.
각 법칙을 잘 보면 어느정도 이해가 간다. 우리가 사용하는 래퍼 클래스, 사용자 정의 클래스, 외부 API에서 의존성 등록해 둔 클래스 그리고 그 내부적으로 사용되는 또 다른 클래스들이 셀 수 없이 많다. 상속 관계들도 생각해보면 쉽지 않다. 그렇기에 이런 법칙들이 없으면 지금의 자바는 없지 않았을까 싶다.

클래스 로더가 클래스를 로드하는 과정은 크게 보면 세 가지 과정을 거친다.
Loading, Link, Initializatio 등 이런 과정을 통해서 클래스는 로드된다.
약 14~5개월 전 쯤 정리한 자료들을 보면서 추가할 내용 추가하며 정리했다. 다음 JVM 관련 글은 아마 ExecutionEngine이 될 것 같다. 그리고 차후에 실제 예제 코드도 작성해보며 공부해야겠다.