→ Class Loader는 자바 바이트 코드를 읽어서 JVM의 Execution Engine이 사용할 수 있도록 Runtime Data Area의 메서드 영역(Method Area)에 적재하는 역할을 한다.
→ 클래스 파일(.class)이 JVM에 로드될 때 가장 먼저 Class Loader를 거쳐간다.

.class 파일을 읽어서 바이너리 코드로 만들고 이를 메모리의 메서드 영역(Method Area)에 저장하는 과정
Fully-Quailified Class Name(FQCN) → 클래스 로더, 클래스 패키지 경로, 패키지 이름, 클래스 이름을 모두 포함한 값 예) Java.lang.Character$SubsetClass, Interface, Enum 을 구분하여 저장Method 와 변수로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 메모리의 힙 영역(Heap Area)에 저장
→ 코드 내부의 레퍼런스를 연결하는 과정
→ .class 파일 형식이 유효한지 검사
⇒ 읽어 들인 클래스가 자바 언어 명세 및 JVM 명세에 명시된 대로 잘 구성되어 있는지 검사
→ 클래스가 필요로 하는 메모리를 할당하고 클래스에서 정의된 필드, 메서드, 인터페이스를 나타내는 데이터 구조를 준비
→ 사용하는 환경에 따라 동작 유무가 정해진다
→ 심볼릭 메모리 레퍼런스를 실제 메모리(메서드 영역 안, 힙 메모리에 있는) 레퍼런스로 교체
→ Optional 인 이유는 이때 교체(binding) 될 수도 있고 이후 사용이 일어날 때에 동적으로 교체될 수도 있기 때문
⇒ 심볼릭 레퍼런스는 메모리 번지의 참조를 의미하는 것이 아니라 이름에 의한 참조를 의미하는 것 (’바로가기’ 파일을 떠울리면 이해가 쉬움)
→ static 변수를 초기화하고 값을 할당하는 과정

→ JVM 시작 시 가장 최초로 실행되는 Class Loader
→ Java 클래스를 로드하는 것이 아닌, Java 클래스를 로드 할 수 있는 Java 자체의 클래스 로더와 최소한의 Java 클래스(java.lang.Object, Class, ClassLoader)만을 로드
→ Native C로 구현돼 있어서, String.class.getClassLoader()는 그냥 null을 반환한다. Primordial(원시적) ClassLoader라고 불리기도 한다
jre/lib/rt.jar 및 기타 핵심 라이브러리와 같은 JDK의 내부 클래스 로드/re.jar 이 존재하지 않으며, /lib 내에 모듈화되어 포함됨 → ClassLoader 내 최상위 클래스들만 로드→ BootStrap ClassLoader를 부모로 가지고, 확장 Java 클래스들을 로드
→ .java.ext.dirs 환경 변수에 설정된 디렉토리 클래스 파일을 로드하고, 이 값이 설정되어 있지 않은 경우 ${JAVA_HOME}/jre/lib/ext에 있는 클래스 파일을 로드
URLClassLoader를 상속하며, jre/lib/ext내 모든 클래스를 로드Platform Loader로 변경되었으며, URLClassLoader가 아닌 BuiltinClassLoader를 상속한다 → Inner Static 클래스로 구현되어 있다→ Java 프로그램 실행 시 지정한 Classpath에 있는 클래스 파일 혹은 jar에 속한 클래스들을 로드
→ 우리가 만든 .class 파일 로드
→ ClassLoader는 클래스 또는 리소스를 찾기 위해 요청을 받았을 때, ClassLoader에게 책임을 위임하는 위임 모델을 따른다
→ 하위 클래스 로더는 상위 클래스 로더가 로드한 클래스를 볼 수 있지만, 반대로 상위 클래스 로더는 하위 클래스 로더가 로드한 클래스를 알 수 없다
→ 이로 인해 java.lang.Object 클래스 등 상위 ClassLoader에서 로드한 클래스도 하위 ClassLoader인 System ClassLoader등 에서 사용할 수 있다
→ 하위 ClassLoader가 상위 ClassLoader에게 로드한 클래스를 다시 로드하지 않아야 한다는 원칙
→ 위임 원칙에 의해서 위쪽으로 책임을 위임하기 때문에 고유한 클래스를 보장할 수 있다
Class Loader 시스템은 바이트 코드를 BootStrap, Extension, Application 3가지의 클래스 로더로 Loading(로딩)하여Linking(링킹)으로 코드 내부의 레퍼런스를 연결하고Initialization(초기화) 과정까지 거쳐Excution Engine이 사용할 수 있도록 JVM 메모리의 메서드 영역에 적재하는 시스템이다.