μ€λμ JREμ ν΅μ¬ ꡬμ±μμμΈ Classloaderμ λν΄μ μμλ³΄λ € νλ€.
μ§λ μκ° μ°λ¦¬λ Java Bytecode μ λν΄μ μμ보μλ€.
μ°λ¦¬κ° .java
νμΌμ μ»΄νμΌνλ€λ©΄ .class
λΌλ λ°μ΄νΈ μ½λλ‘ λ³νμ΄λκ³ JVMμ΄ ν΄λΉ class νμΌμ λμ μΌλ‘ μ€ννλ κ³Όμ μμ κ°μ₯ μ€μν κ²μ΄ λ°λ‘ ClassLoader μ΄λ€.
Java ClassLoader
Javaμ ClassLoader λ JREμ ꡬμ±μμ μ€ νλμ΄λ€.
JREλ JVMκ³Ό Core Java Library λ₯Ό ν¬ν¨νλ©° ClassLoader λ ν¨κ» ν¬ν¨νλ€.
javac
μ»΄νμΌλ¬μ μν΄ μ¬μ©μκ° μμ±ν .java
μμ€μ½λλ₯Ό μ»΄νμΌνμ¬ Bytecode λ₯Ό μμ±νκ³ ν΄λΉ .class
νμΌμ Runtime μΌλ‘ κ°μ Έκ°λ μ΄ μμ μ Java ClassLoader κ° λμνλ€.
μ΄ μμ μμ λ€μ ν λ² μλ° ν΄λμ€λ‘λμ μ μλ₯Ό λ΄λ €λ³΄μλ©΄
μλ° λ°μ΄νΈμ½λλ₯Ό JVM μΌλ‘ λμ λ‘λνλ Java Runtime Environment (JRE)μ μΌλΆμ΄λ€.
μ΄λ¬ν Java ClassLoader κ° μκΈ° λλ¬Έμ Host PCμ νμΌκ³Ό νμΌ μμ€ν μ λν΄μ μ νμκ° μκ³ νλ«νΌμ λ 립μ μ΄κ² λλ κ²μ΄λ€.
μμμ λμ λ‘λνλ λΌλ λ§μ μΌλλ° μ΄ λ§μ λ¬΄μ¨ λ§μΌκΉ?
μλ° ν΄λμ€λ‘λλ .class
νμΌμ ν λ²μ λͺ¨λ μ½μ΄ νμν μμ‘΄ κ΄κ³μ .class
νμΌμ λΆλ¬μ€μ§ μλλ€.
ν΄λμ€λ‘λκ° νμΌμ μ½μΌλ©° νμν μμ μ λμ μΌλ‘ λ‘λνκ³ μ΄λ μ¦, ν΄λμ€κ° νλ‘κ·Έλ¨μ μν΄ νΈμΆλ λ κΉμ§ λ‘λνμ§ μλλ€λ κ²μ μλ―Ένλ€.
μμ κ°μ νΉμ±μ λͺκ°μ§κ° λ μ‘΄μ¬νλλ° νλμ© μμ보λλ‘ νμ.
Java ClassLoader μ νΉμ§
Java Classloader, μλ° ν΄λμ€λ‘λλ 3κ°μ§ λμμΉμ΄ μ‘΄μ¬νλ€.
- Delegation
- Visibility
- Uniqueness
νΉμ§ 1, Deligation
ν΄λμ€λ‘λλ νλλ§ μ‘΄μ¬νμ§ μλλ€.
ν΄λμ€λ‘λλ μΌλ°μ μΌλ‘ μ¬λ¬ κ°μ ν΄λμ€λ‘λκ° μ‘΄μ¬νλ©° κ°κ°μ ν΄λμ€λ‘λλ νλ μΌμ΄ μ ν΄μ Έμλ€.
μ΄λ¬ν ν΄λμ€λ‘λλ€ μ¬μ΄μ κ΄μ¬μ¬μ λ°λΌ μ²λ¦¬λ₯Ό ν μ§ λ§μ§ κ²°μ νλ κ²μ λ°λ‘ μμ λͺ¨λΈ μ΄λΌκ³ νλ©° κ³μΈ΅ ꡬ쑰λ₯Ό λ°νμΌλ‘ λμνλ€.
main()
λ©μλκ° μ‘΄μ¬νλ ClassLoaderRunner
ν΄λμ€μμ μ¬μ©μκ° μ μν Internal ν΄λμ€λ₯Ό λ‘λνλ κ³Όμ μ μμ, Delegationμ νλ¦μΌλ‘ λ°λΌκ°λ³΄μ.
ClassLoaderRunner
ν΄λμ€λApplicationClassLoader
μκ² Internal ν΄λμ€λ₯Ό λ‘λνλΌκ³ μμ²νλ€.ApplicationClassLoader
λ μ§μ λ‘λνμ§ μκ³ λΆλͺ¨μΈExtensionClassLoader
μκ² Internal ν΄λμ€λ₯Ό λ‘λνλΌκ³ μμ²νλ€.- μμ
ExtensionClassLoader
λ μ§μ λ‘λνμ§ μκ³ λΆλͺ¨μΈBootstrapClassLoader
μκ² Internal ν΄λμ€λ₯Ό λ‘λνλΌκ³ μμ²νλ€. BootstrapClassLoader
λrt.jar
μμ ν΄λμ€κ° μ‘΄μ¬νλμ§ νμΈνλ€.- μλ€λ©΄ ν΄λμ€λ₯Ό λ‘λνκ³ μλ€λ©΄
ExtensionClassLoader
μμApplicationClassLoader
κΉμ§ μμ κ³Όμ μ λ°λ³΅νλ€. - λ§μ½ μ‘΄μ¬νμ§ μλλ€λ©΄
ClassNotFoundException
μ throw νλ€.
νΉμ§ 2, Visibility
Visibility Principle μ ν΄λμ€λ‘λμ κ°μλ²μλ μμ ν΄λμ€λ‘λλ§ νμΈν μ μλ€λ κ²μ΄λ€.
λ νμ΄μ μ΄μΌκΈ°νμλ©΄
νμ ν΄λμ€λ‘λλ μμ ν΄λμ€λ‘λκ° λ‘λ©ν ν΄λμ€λ₯Ό νμΈν μ μμ§λ§ μμ ν΄λμ€λ‘λλ νμ ν΄λμ€λ‘λκ° λ‘λ©ν ν΄λμ€λ₯Ό νμΈν μ μλ€.
μ΄ Visibility λ₯Ό μ μ§μΌμΌλ§ Java ClassLoader κ° λλλ°, μ΄ μ μ½μ΄ λ°λ‘ λ€μμ λμ¬ Uniqueness μ΄λ€.
νΉμ§ 3, Uniqueness
μ μΌμ±, Uniqueness μμΉμ Visibility μ νΉμ±μ μ΄μ©ν΄μ ν΄λμ€μ Duplicate loading μ λ§μ μ μκ² λλ€.
μ¦, νμ ν΄λμ€λ‘λλ μμ ν΄λμ€λ‘λκ° λ‘λ©ν ν΄λμ€λ₯Ό λ€μ λ‘λ©νμ§ μλ κ²μ 보μ₯νλ€.
μ΄λ¬ν μ μΌμ±μ μ§ν€κΈ° μν΄μ Visibility μ΄μΈμλ Class Binary nameμ μ΄μ©νλλ°, μ΄λ₯Ό FQCN
, Fully Qualified Class Name μ΄λΌκ³ νλ€.
μ΄λ―Έ λ‘λλ ν΄λμ€μΈμ§ νμΈνκΈ° μν΄μλ Namespace μ 보κ΄λ FQCNμ κΈ°μ€μΌλ‘ ν΄λμ€λ₯Ό μ°Ύμλ³΄κ³ μλ€λ©΄ Delegation μ ν΅ν΄μ ν΄λμ€λ₯Ό λ‘λνλ€.
ν΄λμ€λ‘λμ μ’ λ₯
μμμ λμ¨ Delegation λͺ¨λΈμμ ApplicationClassLoader
λ BootstrapClassLoader
μ κ°μ΄ μ μλ €μ§ ν΄λμ€λ‘λλ€μ΄ μ‘΄μ¬νλλ°, λνμ μΈ JREμ ν΄λμ€λ‘λλ 3κ°μ§κ° μλ€.
- BootstrapClassLoader
- ExtensionClassLoader
- ApplicationClassLoader
μ΄λ€μ κ°κ° λ€μκ³Ό κ°μ μν μ μννλ€.
Bootstrap Classloader
- JVMμ κΈ°λν λ μμ±λ¨.
- Object ν΄λμ€λ₯Ό λΉλ‘―ν μλ° API λ₯Ό λ‘λνλ
Classloader
Extension Classloader
:- κΈ°λ³Έ μλ° APIλ₯Ό μ μΈν νμ₯ ν΄λμ€λ€μ λ‘λνλ
Classloader
- κΈ°λ³Έ μλ° APIλ₯Ό μ μΈν νμ₯ ν΄λμ€λ€μ λ‘λνλ
User-Defined Class Loader
:- μ ν리μΌμ΄μ
μ¬μ©μκ° μ§μ μ½λ μμμ μμ±ν΄μ μ¬μ©νλ
Classloader
- μ ν리μΌμ΄μ
μ¬μ©μκ° μ§μ μ½λ μμμ μμ±ν΄μ μ¬μ©νλ
λ€μ μ½λλ₯Ό μ°Έκ³ ν΄λ³΄μ
public class Main {
public static void main(String[] args) {
System.out.println("μ°λ¦¬κ° μ μν ν΄λμ€ : " + Main.class.getClassLoader()); // jdk.internal.loader.ClassLoaders$AppClassLoader
System.out.println("Logging ν΄λμ€ : "
+ Logging.class.getClassLoader()); // Logging:sun.misc.Launcher$ExtClassLoader
System.out.println("Java Utilμ ν¬ν¨λ ν΄λμ€ " + String.class.getClassLoader()); // null
}
}
μμ μ½λμμ 3κ°μ§μ λνμ μΈ ν΄λμ€λ‘λλ₯Ό λͺ¨λ νμΈν μ μλ€.
μμμ 3λ²μ§ΈμΈ BootstrapClassLoader λ μΆλ ₯ κ²°κ³Όκ° Null λ‘ λ³΄μ΄λλ°, μ΄ μ΄μ λ Native C λ‘ κ΅¬νμ΄ λμ΄μκΈ° λλ¬Έμ Java Runtime μμ Loadλ₯Ό ν μ μκΈ° λλ¬Έμ΄λ€.
ν΄λμ€λ‘λλ 3κ°μ§ ν΄λμ€λ‘λ μ΄μΈμλ μ°λ¦¬κ° μ§μ λ§λ€μ΄μ μ¬μ©ν μ μλ€.
ClassLoaderκ° ν΄λμ€λ₯Ό λ‘λνλ λμ κ³Όμ
μμμ λ³Έ νΉμ§κ³Ό μμΉλ€μ λ§μ‘±νλ νκ²½μμ ν΄λμ€λ‘λλ λ€μκ³Ό κ°μ κ³Όμ μ κ±°μ³ ν΄λμ€λ₯Ό λ‘λνκ³ λ§ν¬νλ©° μ΄κΈ°νλ₯Ό νλ€
- λ‘λ Loading
- Class file μ κ°μ Έμμ JVMμ λ©λͺ¨λ¦¬μ λ‘λνλ€.
- κ²μ¦ Verifying
- Java Language Specification λ° JVM λͺ μΈμ μλ°°λ μ λ³΄κ° μλμ§ κ²μ¬νλ€.
- κ°μ₯ 볡μ‘νκ³ μκ°μ΄ μ€λ걸리λ λΆλΆμ΄λ€.
- μ€λΉ Preparing
- ν΄λμ€κ° νμλ‘νλ λ©λͺ¨λ¦¬λ₯Ό ν λΉνλ€.
- ν΄λμ€μμ μ μλ νλ, λ©μλ, μΈν°νμ΄μ€λ₯Ό λνλ΄λ struct λ₯Ό μ€λΉνλ€.
- λΆμ Linking
- ν΄λμ€μ μμ ν λ΄ λͺ¨λ μ¬λ³Όλ¦ λ νΌλ°μ€λ₯Ό λ€μ΄λ νΈ λ νΌλ°μ€λ‘ λ³κ²½νλ€.
- μ΄κΈ°ν Initializing
- ν΄λμ€ λ³μλ€μ μ μ ν κ°μΌλ‘ μ΄κΈ°ννλ€.
κ²°λ‘
μ°λ¦¬λ μ΄λ²μ ν΄λμ€λ‘λλ 무μμΈκ°, ν΄λμ€λ‘λμ νΉμ§ λ° μμΉ, ν΄λμ€λ‘λμ λμ κ³Όμ , ν΄λμ€λ‘λμ μ’ λ₯μ λν΄μ μμ보μλ€.
μ΄λ° ν΄λμ€λ‘λκ° μ§μ ν΄λμ€νμΌμ λΆλ¬λ€μ΄κΈ° λλ¬Έμ JVMμ μ§μ μ μΈ ν΄λμ€μ μ°κ΄μ΄ μκΈ°μ§ μκ³ λ 립μ μΌλ‘ λμν μ μκ² λλ κ²μ΄λ€.
λκΈ