1. ๊ฐœ์š”
Cass Loader ๋ž€ abstrace class๋กœ์จ Bytecode๋ฅผ ์ฝ์–ด ๋“ค์—ฌ์„œ class ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š”
์—ญํ™œ์„ ๋‹ด๋‹นํ•œ๋‹ค.

Class Loader๊ฐ€ Class๋ฅผ Loadingํ•˜๋Š” ์‹œ์ ์€ ComplieTime์ด ์•„๋‹Œ Run Time์— Loading์ด ๋œ๋‹ค.

ํ”„๋กœ๊ทธ๋ž˜๋จธ ๊ฐ€ SampleTest aaa = new SampleTest(); ๋ผ๋Š” ์ฝ”๋“œ๋ฅผ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด
JVM์€ SampleTest๋ผ๋Š” Class๋ฅผ Class Loader๋ฅผ ํ†ตํ•ด์„œ SampleTest.clas์˜ ByteCode๋ฅผ
์ตœ์ดˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— Loadํ•˜๊ฒŒ ๋œ๋‹ค. 



2. ClassLoader ๊ธฐ์ˆ ์  ํŠน์ง•
   - Hierarchical 
     Class Loader๋Š” Hierarchical ํ•˜๊ฒŒ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๊ณ , Parent class laoder์—์„œ, child class loader๋ฅผ
     ๊ฐ–๋Š”๊ฒƒ๊ณผ ๊ฐ™์ด Class Loader๊ฐ„์˜ ๊ณ„์ธตํ˜• ๊ตฌ์กฐ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค. ์ตœ์ƒ์œ„ Class Loader๋Š”  
     "bootstrap"   Class Loader๊ฐ€ ์œ„์น˜ ํ•˜๊ฒŒ ๋œ๋‹ค.

   - Delegate load request
      Class loading์—๋Š” ์ผ์ •ํ•œ ๊ทœ์น™์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋Š” Class Loader๊ฐ€ ๊ณ„์ธกํ˜•์˜ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ 
      ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์–ด๋Š ์‹œ์ ์— Class ๋กœ๋”ฉ ์š”์ฒญ์„ ๋ฐ›์œผ๋ฉด ์ƒ์œ„ Class Loader๊ฐ€ Lodingํ•œ Class๊ฐ€ 
      ์šฐ์„ ๊ถŒ์„ ๊ฐ€์ง„๋‹ค. 

   - Have visibility constraint
     Child Class Loader๋Š” Parent Class Loader์˜ Clss๋ฅผ ์ฐพ์„์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ๋ฐ˜๋Œ€์˜ ๊ฒฝ์šฐ๋Š” ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

   - Cannot unload classes
      Class Loader์— ์˜ํ•ด์„œ Loading๋œ Class๋“ค์€ unload ๋ ์ˆ˜๊ฐ€ ์—†๋‹ค.



3. Class Loader ์œ„์ž„
   -

์˜†์˜ ๊ทธ๋ฆผ์€ class loader delegation model ์ด๋‹ค.
     ์ด๋Š” Loading์š”์ฒญ์„ ์„œ๋กœ ์—๊ฒŒ
     ์ „๋‹ฌ ํ•˜๋Š” ClassLoader์˜ ๊ทธ๋ž˜ํ”„
     ์ด๋‹ค. 

     ์˜†์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด Class Loader
     ๋“ค์€ ํ•˜๋‚˜์˜ delegation parent์™€
     ํ•จ๊ป˜์ƒ์„ฑ๋˜๊ณ  ๋‹ค์Œ ์œ„์น˜ ์—์„œ
     Class๋ฅผ ์ฐพ๋Š”๋‹ค.

     * ๋‹ค์Œ ์œ„์น˜๋ž€
      Cache, Parent, Self

    CalssLoader๊ฐ€ ์ตœ์ดˆ ํ•˜๋Š” ์ผ์€
    ์ „์—๋„ ๊ฐ™์€ Class๋ฅผ Loading
    ํ•˜๋„๋ก ์š”์ฒญ์„ ๋ฐ›์•˜๋Š”์ง€๋ฅผ
    ๋จผ์ € ํŒŒ์•…ํ•œ๋‹ค.

    ๋งŒ์•ฝ ์š”์ฒญ์„ ๋ฐ›์€์ ์ด ์žˆ์œผ๋ฉด,
    Cache์— ์ €์žฅ๋œ Class๋ฅผ
    ๋ฆฌํ„ด ํ•œ๋‹ค.

    ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ,
    Parent Class๋ฅผ Loading ํ• 
    ๊ธฐํšŒ๋ฅผ ์ค€๋‹ค.

    ์ด๋Ÿฌํ•œ ๋‘ ๋‹จ๊ณ„๋“ค์ด ๋ฐ˜๋ณต๋˜๊ณ  Depth First ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰์ด ์ง„ํ–‰ ๋œ๋‹ค.

    ๋งŒ์•ฝ Parent Class์—๋„ ํ•ด๋‹น Class๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด (ClassNotFoundException)
    ClassLoader๋Š” Class์˜ ์†Œ์Šค์— ๋Œ€ํ•œ ๊ณต์œ (์ž‘์—…ํ•œ ์ฝ”๋“œ)์˜ ๊ฒฝ๋กœ (Self)๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค.

    Parent ClassLoader๋Š” Class๋ฅผ ์ฒ˜์Œ์œผ๋กœ loadingํ•  ๊ธฐํšŒ๊ฐ€ ์ฃผ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— Root์—
    ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ClassLoader์— ์˜ํ•ด ๋กœ๋”ฉ ๋œ๋‹ค.

   ๊ฐ€์žฅ ํ•ต์‹ฌ์ ์ธ bootstrap class๋“ค์€ java.lang.Object๊ฐ™์€ ์ •ํ™•ํ•œ ํด๋ž˜์Šค ๋ฒ„์ „์ด ๋กœ๋”ฉ๋˜์—ˆ๋Š”์ง€๋ฅผ
   ํ™•์ธํ•˜๊ณ , Class Loader๊ฐ€ ๊ทธ ์ž์ฒด ๋˜๋Š” ๋ถ€๋ชจ(Parent)์— ์˜ํ•ด์„œ Loading ๋˜์—ˆ๋Š”์ง€๋ฅผ
   Class๊ฐ€ ๋ถˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์œ„์—์„œ ๋งํ–ˆ๋‹ค ์‹ถ์ด ์ž์‹์— ์˜ํ•ด Loading๋œ Class ๋“ค์€ ๋ณผ ์ˆ˜ ์—†๋‹ค. 


   - Bootstrap Class Loader
   ๋‹ค๋ฅธ ClassLoader๋“ค๊ณผ๋Š” ๋‹ฌ๋ฆฌ Bootstrap Class Loader ๋Š” ์ž๋ฐ” ์ฝ”๋“œ์— ์˜ํ•ด์„œ
   instanceํ™” ๋  ์ˆ˜ ์—†๋‹ค
   Bootstrap ClassLoader ๋Š” Boot ClassPath์—์„œ ํ•ต์‹ฌ ์‹œ์Šคํ…œ Class๋“ค์„ ๋กœ๋”ฉํ•˜๋Š”๋ฐ
   ์ด๊ฒƒ์€ ์ผ๋ฐ˜์ ์œผ๋กœ JavaHome์˜ jre/lib ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” JAR ํŒŒ์ผ๋“ค์ด๋‹ค.
   ๋‹จ -Xbootclasspath ์˜ต์…˜์œผ๋กœ classpath๋ฅผ ์ถ”๊ฐ€ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.


   - Extension Class Loader
   ์ฃผ๋กœ jre/lib/ext ๋””๋ ‰ํ† ๋ฆฌ์— ์œ„์น˜ํ•œ Extension ๋””๋ ‰ํ† ๋ฆฌ์—์„œ Class ๋“ค์„ Loading ํ•œ๋‹ค. 
   ์‚ฌ์šฉ์ž์˜ classpath๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์–‘ํ•œ ๋ณด์•ˆ ํ™•์žฅ ๊ฐ™์€ ์ƒˆ๋กœ์šด ํ™•์ž์œผ๋กœ ์‰ฝ๊ฒŒ
   ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต ํ•œ๋‹ค.

   - System Class Loader 
   CLASSPATH ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์ง€์ •๋œ ๊ฒฐ๋กœ์—์„œ ์ฝ”๋“œ๋ฅผ ๋กœ๋”ฉ ํ•œ๋‹ค. 
   ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด Class Loader๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ƒ์„ฑํ•œ ๋ชจ๋“  ClassLoader์˜ Parent ์ด๋‹ค. 


  
4. Class Loding ๋‹จ๊ณ„ 
   - Class Loadig์€ Loading, Linking, initialzing ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ง„๋‹ค.

   - ๋Œ€๋ถ€๋ถ„์˜ Class Loading๊ณผ ๊ด€๋ จ๋œ ๋ฌธ์ œ๋Š” ์ด ์„ธ๋‹จ๊ณ„ ์ค‘ ํ•œ ๋‹จ๊ณ„์—์„œ ๋ฐœ์ƒํ•œ๋‹ค.

   - ๋กœ๋”ฉ ๋‹จ๊ณ„๋Š” ํ•„์š”ํ•œ Class File์„ ๋ฐฐ์น˜ํ•˜๊ณ  ByteCode๋กœ Loadingํ•˜๋Š” ๋‹จ๊ณ„ ์ด๋‹ค.

   - JVM์˜ ๋กœ๋”ฉ ํ”„๋กœ์„ธ์Šค๋Š” Class ๊ฐ์ฒด์— ๋งค์šฐ ๊ธฐ๋ณธ์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
     ๋ฉ”์†Œ๋“œ, ํ•„๋“œ, ๊ธฐํƒ€ ์ฐธ์กฐ Class ๋“ค์ด ์ด ๋‹จ๊ณ„์—์„œ๋Š” ๋‹ค๋ฃจ์–ด์ง€์ง€ ์•Š๋Š”๋‹ค.

 
   - Linking์€ ์„ธ ๋‹จ๊ณ„ ์ค‘์—์„œ ๊ฐ€์žฅ ๋ณต์žกํ•œ ๋‹จ๊ณ„์ด๋‹ค. ๋‹ค๋ฆ„๊ณผ ๊ฐ™์ด ์„ธ ๊ฐœ์˜ ์ฃผ์š” ๋‹จ๊ณ„๋“ค๋กœ ๋‚˜๋‰œ๋‹ค. 
     ใ„ฑ. ByteCode ํ™•์ธ - ByteCode๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ ํ•˜๋Š”์ง€ ํ™•์ธ ํ•œ๋‹ค. 
     ใ„ด. Class Preparation - Class ์—์„œ ์ •์˜๋œ ํ•„๋“œ, ๋ฉ”์†Œ๋“œ, ์ธํ„ฐํŽ˜์ž‡ ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” 
                                       ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ค€๋น„ํ•œ๋‹ค. 
     ใ„ท. Resolving - Class ์— ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฐธ์กฐ๋œ ๋ชจ๋“  Class๋“ค์„ Loadingํ•œ๋‹ค. 
                         - super class, interface, fild, method signature, local fild

   - initialize ๋‹จ๊ณ„ ๋™์•ˆ, Class ๋‚ด์— ํฌํ•จ๋œ ์ •์  initializer๋“ค์ด ์‹คํ–‰๋œ๋‹ค. ์ด ๋‹จ๊ณ„์˜ ๋์— ๊ฐ€์„œ๋Š” 
     ๊ธฐ๋ณธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ๋‹ค. 

   - ์ด ์„ธ ๋‹จ๊ณ„๋ฅผ ์ง€๋‚˜๋ฉด Class๋Š” ์™„์ „ํžˆ ๋กœ๋”ฉ๋˜๊ณ  ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋œ๋‹ค. 
     Class Loading์€ Lazy๋ฐฉ์‹์œผ๋กœ ์ˆ˜ํ–‰ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ผ๋ถ€ Class Loading Processor ๋Š” 
     Loading ์‹œ์ ์™ธ์— ์ฒ˜์Œ ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ๋‹ค.   


5. Explicit Loading vs Implicit Loading
   - ํด๋ž˜์Šค๊ฐ€ ๋กœ๋”ฉ๋˜๋Š” ๋‘๊ฐ€์ง€ ๋ฐฉ์‹์˜ ์ฐจ์ด
   - Explicit : ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ๋“ค ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ๋”ฉ๋  ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.
                  - (java.lang.ClassLoader).loadClass()
                  - Class.forName()
   - ์ด๋Ÿฌํ•œ ๋ฉ”์†Œ๋“œ๋“ค ์ค‘ ํ•˜๋‚˜๊ฐ€ ํ˜ธ์ถœ ๋˜๋ฉด ์ด๋ฆ„์ด ์ธ์ž๋กœ ์ง€์ •๋œ ํด๋ž˜์Šค๊ฐ€ ํด๋ž˜์Šค ๋กœ๋”์— ์˜ํ•ด์„œ
     ๋กœ๋”ฉ
๋œ๋‹ค. 
     ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ, ๋กœ๋”๋Š” ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๊ธฐ ์œ„ํ•ด delegation model์„ ์‚ฌ์šฉํ•œ๋‹ค.
 
   - Implicit : Class ๊ฐ€ ๋ ˆํผ๋Ÿฐ์Šค, ์ธ์Šคํ„ด์Šคํ™”, ๋ช…์‹œ์  ๋ฉ”์†Œ๋“œ ํ˜ธ์ถœ์„ ์ œ์™ธํ•œ ์ƒ์†์˜ ๊ฒฝ์šฐ ๋กœ๋”ฉ๋˜๋Š” ๋ฐฉ์‹
                   ์ด ๊ฒฝ์šฐ ์Šฌ๊ทธ๋จธ๋‹ˆ ๋กœ๋”ฉ์ž‘์—…์€ ์ดˆ๊ธฐํ™”๋˜๊ณ  JVM์€ ํ•„์š”ํ•œ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ
                   ๋งŒ์•ฝ ๋กœ๋”ฉ์ด ๋˜์–ด ์žˆ์œผ๋ฉด ๋ ˆํผ๋Ÿฐ์Šค๋งŒ ๋ฆฌํ„ด๋˜๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒฝ์šฐ ๋ธ๋ฆฌ๊ฒŒ์ด์…˜ ๋ชจ๋ธ์„
                   ์‚ฌ์šฉํ•˜์—ฌ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๊ฒŒ ๋œ๋‹ค. 

   


์ฐธ๊ณ  ์ž๋ฃŒ:
http://www.ibm.com/developerworks/java/library/j-dclp1/index.html?S_TACT=105AGX02&S_CMP=EDU
๋ฐ ์ธํ„ฐ๋„ท ๋ฌธ์„œ



์ถœ์ฒ˜ : http://liebus.tistory.com/30