1. Class Loader๋ž€ ?


Java๋Š” Runtime๋™์•ˆ ํ•„์š”ํ•œ ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋™์ ์œผ๋กœ ์ฝ์–ด์˜ค๋Š”๋ฐ Class Loader๋Š” ์—ฌ๊ธฐ์„œ Java ํด๋ž˜์Šค๋ฅผ JVM์— ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. JVM์ด ๋™์ž‘ํ•˜๋‹ค๊ฐ€ ํ•„์š”ํ•œ ์ˆœ๊ฐ„(ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๋Š” ์ˆœ๊ฐ„)์— ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฝ์–ด ๋ฉ”๋ชจ๋ฆฌ์— ๋™์ ์œผ๋กœ ๋กœ๋“œํ•œ๋‹ค.

Class Loader ๋•๋ถ„์— JVM์€ Java ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๋“ค์„ ๋ชจ๋‘ ๊ฐ€์ง€๊ณ  ์žˆ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.


2. ๋‚ด์žฅ Class Loader์˜ ์ข…๋ฅ˜

2-1. Bootstrap Class Loader

๋ชจ๋“  Java ํด๋ž˜์Šค๋Š” Java.lang.ClassLoader์— ์˜ํ•ด์„œ ๋กœ๋“œ๋œ๋‹ค. ํ•˜์ง€๋งŒ ClassLoader ์ž์ฒด๋„ ํด๋ž˜์Šค์ด๋‹ค.

ClassLoader ์ž์ฒด๋„ ํด๋ž˜์Šค๋ผ๋ฉด ClassLoader๋Š” ๋ˆ„๊ฐ€ ๋กœ๋“œํ• ๊นŒ ? ์–ด๋”˜๊ฐ€์—์„œ ๋กœ๋“œํ•ด์„œ ClassLoader๊ฐ€ ์ž‘๋™์„ ํ• ํ…Œ๋‹ˆ ๋ง์ด๋‹ค.
์ด๋Ÿฌํ•œ ClassLoader๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ด Bootstrap Class Loader์ด๋‹ค.

2-2. Extension Class Loader (Java 8 ๊ธฐ์ค€์ด๋ฆ„)

2-3. Application Class Loader (Java 8 ๊ธฐ์ค€์ด๋ฆ„)


3. Java 9 ์ด์ƒ ๋ฒ„์ „์—์„œ์˜ ๋‚ด์žฅ Class Loader

์œ„์˜ ๋‚ด์šฉ์—์„œ Java 8 ๊ธฐ์ค€์ด๋ผ๊ณ  ์ ํžŒ ๋‚ด์šฉ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
Java 9 ๋ฒ„์ „ ์ด์ƒ๋ถ€ํ„ฐ๋Š” ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๋„์ž…์— ๋งž์ถฐ ์ด๋ฆ„๊ณผ ๋ฒ”์œ„ ๊ตฌํ˜„ ๋‚ด์šฉ ๋“ฑ์ด ๋ฐ”๋€Œ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

3-1. rt.jar, tools.jar๊ฐ€ ์ œ๊ฑฐ๋จ

rt.jar, tools.jar์™€ ๊ธฐํƒ€ ๋‹ค์–‘ํ•œ ๋‚ด๋ถ€ JARํŒŒ์ผ์— ์ €์žฅ๋œ ํด๋ž˜์Šค ๋ฐ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์€ ๋ณด๋‹ค ํšจ์œจ์ ์ธ ํ˜•์‹์œผ๋กœ libํด๋” ์•ˆ์— ์ €์žฅ๋œ๋‹ค.
์ด์— ๋”ฐ๋ผ rt.jar๋‚ด์˜ ํด๋ž˜์Šค๋ฅผ ๋กœ๋”ฉํ•˜๋˜ Bootstrap Class Loader๊ฐ€ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ์ค„์–ด๋“ค์—ˆ๋‹ค.

3-2. jre/lib/ext, java.ext.dirs, lib/endorsed, java.endorsed.dirs๊ฐ€ ์ œ๊ฑฐ๋จ

์œ„์— ์–ธ๊ธ‰ํ•œ ๋ถ€๋ถ„์ด ์ œ๊ฑฐ๋จ์— ๋”ฐ๋ผ jre/lib/ext, lib/endorsed๊ฐ€ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๊ฑฐ๋‚˜ java.ext.dirs, java.endorsed.dirs๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด javac๋‚˜ java๋Š” ์ข…๋ฃŒ๋œ๋‹ค.

3-3. ๋ณ€๊ฒฝ๋‚ด์šฉ ์ •๋ฆฌ

Java 8 Java 9 ๋ณ€๊ฒฝ ๋‚ด์šฉ
Bootstrap
ClassLoader
๋ณ€๊ฒฝ ๋˜์ง€ ์•Š์Œ rt.jar ๋“ฑ์ด ์—†์–ด์ง์— ๋”ฐ๋ผ ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋Š” ํด๋ž˜์Šค์˜ ๋ฒ”์œ„๊ฐ€ ์ „๋ฐ˜์ ์œผ๋กœ ์ถ•์†Œ
Extension
ClassLoader
Platform
ClassLoader
1. jre/lib/ext, java.ext.dirs๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Œ Java SE์˜ ๋ชจ๋“  ํด๋ž˜์Šค์™€ Java SE์—๋Š” ์—†์ง€๋งŒ JCP์— ์˜ํ•ด ํ‘œ์ค€ํ™” ๋œ ๋ชจ๋“ˆ ๋‚ด์˜ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Java 8์— ๋น„ํ•ด ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ฒ”์œ„๊ฐ€ ํ™•์žฅ๋จ
2. URLClassLoader๊ฐ€ ์•„๋‹Œ BuiltinClassLoader๋ฅผ ์ƒ์†๋ฐ›์•„ ClassLoders ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ static ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋จ
Application
ClassLoader
System
ClassLoader
URLClassLoader๊ฐ€ ์•„๋‹Œ BuiltinClassLoader๋ฅผ ์ƒ์†๋ฐ›์•„ ClassLoders ํด๋ž˜์Šค์˜ ๋‚ด๋ถ€ static ํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋จ

4. Class Loader์˜ ์›์น™


ํด๋ž˜์Šค ๋กœ๋”์˜ ์›์น™์€ ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. ๊ฐ€์‹œ์„ฑ ์›์น™
  2. ์œ ์ผ์„ฑ ์›์น™
  3. ์œ„์ž„ ๊ณ„์ธต
  4. ์–ธ๋กœ๋“œ(Unload) ๋ถˆ๊ฐ€

4-1. ๊ฐ€์‹œ์„ฑ ์›์น™

3๋ฒˆ ํ•ญ๋ชฉ์—์„œ ์„ค๋ช…ํ–ˆ๋“ฏ์ด ๊ฐ ํด๋ž˜์Šค ๋กœ๋”๋“ค์€ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•˜์œ„ ํด๋ž˜์Šค๋Š” ์ƒ์œ„ ํด๋ž˜์Šค๋ฅผ ์ƒ์†ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ตฌ์กฐ์—์„œ ํด๋ž˜์Šค ๋กœ๋”๋ฅผ ์š”์ฒญ๋ฐ›์•„ ํด๋ž˜์Šค ๋กœ๋” ์บ์‹œ๋ฅผ ํ™•์ธํ•  ๋•Œ, ์ž์‹ ํด๋ž˜์Šค ๋กœ๋”๋Š” ๋ถ€๋ชจ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋กœ๋“œํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ€๋ชจ ํด๋ž˜์Šค ๋กœ๋”๋Š” ์ž์‹ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋กœ๋“œํ•œ ํด๋ž˜์Šค๋ฅผ ๋ณผ ์ˆ˜ ์—†๋‹ค๋Š” ์›์น™์ด๋‹ค.

4-2. ์œ ์ผ์„ฑ ์›์น™

๋ถ€๋ชจ๊ฐ€ ๋กœ๋“œํ•œ ํด๋ž˜์Šค๋ฅผ ์ž์‹ ํด๋ž˜์Šค ๋กœ๋”๊ฐ€ ๋‹ค์‹œ ๋กœ๋“œํ•˜์ง€ ์•Š์•„์•ผํ•˜๋ฉฐ ์ด๋ฏธ ๋กœ๋“œํ•œ ํด๋ž˜์Šค๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•ด์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ์›์น™์ด๋‹ค.
์ด ์›์น™์„ ํ†ตํ•ด ํด๋ž˜์Šค๊ฐ€ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค.

4-3. ์œ„์ž„ ๊ณ„์ธต

์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฐ€์‹œ์„ฑ ์›์น™๊ณผ ์œ ์ผ์„ฑ ์›์น™์„ ์ถฉ์กฑํ•˜๊ธฐ ์œ„ํ•ด JVM์€ ํด๋ž˜์Šค ๋กœ๋”ฉ ์š”์ฒญ์„ ์•„๋ž˜์™€ ๊ฐ™์€ ์ˆœ์„œ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

  1. ํด๋ž˜์Šค ๋กœ๋” ์บ์‹œ
  2. ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”
  3. ์ž๊ธฐ ์ž์‹ 

4-4. ์–ธ๋กœ๋“œ ๋ถˆ๊ฐ€

์–ธ๋กœ๋“œ ๋ถˆ๊ฐ€ ์›์น™์€ ๋ง๊ทธ๋Œ€๋กœ ์ด๋ฏธ ๋กœ๋“œํ•œ ํด๋ž˜์Šค๋ฅผ ์–ธ๋กœ๋“œ(Unload)ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์›์น™์ด๋‹ค.

5. Class Loader์˜ ๋™์ž‘ ์ˆœ์„œ


ํด๋ž˜์Šค ๋กœ๋” ์‹œ์Šคํ…œ์˜ ํฌ๊ฒŒ 3๊ฐ€์ง€์˜ ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค.

  1. ๋กœ๋”ฉ
  2. ๋งํฌ
  3. ์ดˆ๊ธฐํ™”

5-1. ๋กœ๋”ฉ

๋กœ๋”ฉ ๋‹จ๊ณ„๋Š” .class ํŒŒ์ผ์„ ์ฝ์–ด์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๋กœ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์˜ ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area)์— ์ €์žฅํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
JVM์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

5-2. ๋งํฌ

๋งํฌ ๋‹จ๊ณ„๋Š” ๋กœ๋“œ๋œ Class, Interface ๋“ฑ์„ ๊ฒ€์ฆ, ์ค€๋น„, ํ•ด์„ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

5-3. ์ดˆ๊ธฐํ™”

์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋Š” ๋กœ๋“œ๋œ ๊ฐ Class๋‚˜ Interface์˜ ์ดˆ๊ธฐํ™” ๋กœ์ง์ด ์‹คํ–‰๋˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.

์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์˜ ์ถœ์ฒ˜

IBM ํด๋ž˜์Šค ๋กœ๋”ฉ ๋ธ”๋กœ๊ทธ Oracle ๋กœ๋”ฉ, ๋งํ‚น, ์ดˆ๊ธฐํ™” Constant Pool ๋ธ”๋กœ๊ทธ