자바 개발을 해봤다면, .java 파일과 .class 파일이 생성되는 것을 봤을 것이다.
.java 파일은 자바 파일이라고 하며, java 언어로 소스 코드를 작성할 때,
해당 소스 코드 내용을 적는 파일을 말한다.
그리고 이 소스 코드 파일 즉, .java 파일을 컴파일하게 되면 .class 파일이 생성 되는데,
이를 클래스 파일 또는 자바 바이트 코드라고 부른다.
자바 바이트 코드는 JVM 만 설치되어 있다면, 어떤 운영체제이든 상관없이 Java 언어로 작성된 코드를 실행할 수 있다.
흔히 Eclipse와 같은 IDE 혹은 커맨드 라인을 활용하여,
'javac' 라는 명령어를 통해 컴파일 했을 때 나오는 파일인 것이다.
JAVA 언어로 작성된 클래스 파일은 JVM 위에서 동작한다.
JAVA ClassLoader는 컴파일된 파일(.class)을 JVM 위로 올리는(런타임 메모리 영역에)(Load) 동작을 수행한다.

자바는 동적로딩을 하는 특징이 있는데, 동적 로딩을 담당하는 부분이 ClassLoader이다.
즉 클래스 로더가 Java로 작성된 프로그램의 런타임(Runtime) 중에,
JVM의 메소드 영역에 동적으로 JAVA 클래스를 Load 하는 역할을 한다.
로딩(Loading)
.class 파일을 읽어서 바이너리 코드(Binary Code)로 만들고, 이를 메모리의 메소드 영역에 저장하는 과정
1) Class, Interface, Enum을 구분하여 저장한다
2) 메서드와 변수도 저장.
3) 로딩이 끝나면 해당 클래스 타입의 객체를 생성하여 메모리의 힙 영역(Heap Area)에 저장.
-- 수직관계에 있는 클래스 로더들이 정해진 순서에 따라 클래스를 로딩한다.
-- 클래스 로딩을 요청할 때 상위 클래스 방향으로 위임하는 메커니즘(Delegation Model)을 적용한다.
링크(Linking)
: 코드 내부의 참조(레퍼런스)를 연결하는 과정.
동적 로딩(Dynamic Loading) : 프로그램을 실행할 때(런타임 중), 필요할 때마다 동적으로 메모리를 할당하고 적재하며, 필요 없는 메모리는 자동으로 할당 해제하여, 메모리를 효율적으로 관리하는 로딩 방식.
<=> 정적 로딩(Static Loading) : 프로그램을 실행할 때(실행하는 순간), 모든 실행 파일을 메모리에 적재하는 방식.
: JVM 시작 시 가장 최초로 실행되는 클래스 로더로, Java 클래스를 로드하는 것이 아닌, Java 클래스를 로드할 수 있도록 하는 자바 자체의 클래스 로더와 최소한의 자바 클래스(java.lang.Object / Class / ClassLoader)만을 로드하는 역할을 수행.
: JVM 시작 시 가장 최초로 실행되는 클래스 로더로, Java 클래스를 로드하는 것이 아닌, Java 클래스를 로드할 수 있도록 하는 자바 자체의 클래스 로더와 최소한의 자바 클래스(java.lang.Object / Class / ClassLoader)만을 로드하는 역할을 수행.
: 자바 프로그램 실행 시 지정한 Classpath 에 있는 클래스 파일 혹은 jar 에 속한 클래스들을 로드함. 개발자가 어플리케이션 구동을 위해 직접 작성한 대부분의 클래스가 이 클래스로더에 의해 로딩됨.
0) JVM 메서드 영역에 클래스가 로드 되어있는지 확인(로드되어 있으면 해당 클래스 사용)
1) 메서드 영역에 클래스가 로드가 되어있지 않는 경우, 시스템 클래스 로더에 클래스 로드를 요청.
2) 시스템 클래스 로더는 확장 클래스 로드에 요청을 위임.
3) 부트스트랩 클래스로더는 부트스트랩 ClassPath(JDK/JRE/LIB)에 해당 클래스가 있는 확인 후.
존재하지 않으면 확장 클래스 로더에 요청을 넘긴다.
4) 확장 클래스 로더는 확장 ClassPath(JDK/JRE/LIB/EXT)에 해당 클래스가 있는지 확인후, 클래스가 존재하지 않을 경우 시스템 클래스 로더에게 요청을 넘김
5.)시스템 클래스 로더는 시스템 ClassPath에 해당 클래스가 있는지 확인 후, 클래스가 존재하지 않는 경우 ClassNotFoundException Error를 발생시킨다.
: 자바 프로그램 실행 시 지정한 Classpath 에 있는 클래스 파일 혹은 jar 에 속한 클래스들을 로드함. 개발자가 어플리케이션 구동을 위해 직접 작성한 대부분의 클래스가 이 클래스로더에 의해 로딩됨.