5 ๋ถ„ ์†Œ์š”


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์ด๋‹ค.

  • Bootstrap Class Loader๋Š” \($\)Java_HOME/jre/lib ์— ์žˆ๋Š” rt.jar ๋ฐ ๊ธฐํƒ€ ํ•ต์‹ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๊ฐ™์€ JDK ๋‚ด๋ถ€์˜ ํด๋ž˜์Šค๋ฅผ ๋กœ๋“œํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.(Java 8 ๊ธฐ์ค€)
  • ๋˜ํ•œ Bootstrap Class Loader๋Š” ๋ชจ๋“  ClassLoader ์ธ์Šคํ„ด์Šค์˜ ๋ถ€๋ชจ ์—ญํ• ์ด๋‹ค.
  • Bootstrap Class Loader๋Š” Java๊ฐ€ ์•„๋‹Œ ๋„ค์ดํ‹ฐ๋ธŒ ์–ธ์–ด(Native C)๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๋‹ค.
  • ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” java.lang ํŒจํ‚ค์ง€ ์•ˆ์— ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ๋กœ๋“œํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. (ex. java.lang.Object, java.lang.Classloader)

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

  • Extension Class Loader๋Š” Bootstrap Class Loader์˜ ์ž์‹์ด๋‹ค.
  • ์ผ๋ฐ˜์ ์œผ๋กœ \($\)JAVA_HOME/jre/lib/ext ํด๋”๋‚˜ java.ext.dirs ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ง€์ •๋œ ํด๋”์— ์žˆ๋Š” ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋”ฉํ•œ๋‹ค.(Java 8 ๊ธฐ์ค€)
  • URLClassLoader๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค.(Java 8 ๊ธฐ์ค€)
  • Bootstrap Class Loader์™€ ๋‹ค๋ฅด๊ฒŒ Java๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

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

  • Extension Class Loader๋ฅผ ๋ถ€๋ชจ๋กœ ๋‘”๋‹ค.
  • ์ง€์ •๋œ class path์— ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ๋กœ๋”ฉํ•œ๋‹ค.
  • sun.misc.Launcher ํด๋ž˜์Šค ์•ˆ์— staticํด๋ž˜์Šค๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉฐ, URLClassLoader๋ฅผ ์ƒ์†ํ•˜๊ณ  ์žˆ๋‹ค.(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. ์ž๊ธฐ ์ž์‹ 
  • ์ด์ „์— ๋กœ๋“œ๋œ ํด๋ž˜์Šค์ธ์ง€ ํด๋ž˜์Šค ๋กœ๋” ์บ์‹œ๋ฅผ ํ™•์ธํ•˜๊ณ  ์—†๋‹ค๋ฉด ์ƒ์œ„ ํด๋ž˜์Šค ๋กœ๋”์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.
    Application Loader๋Š” Extension Loader์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•˜๊ณ  Extension์€ Bootstrap Loader์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.
  • ์š”์ฒญ์„ ์œ„์ž„๋ฐ›์€ Bootstrap Loader๋Š” Java ๋ฒ„์ „์— ๋งž๊ฒŒโ“ Java 8๋ฒ„์ „ : rt.jar์— ๋‹ด๊ธด jdk ํด๋ž˜์Šค ํŒŒ์ผ์„ ๋กœ๋”ฉ
    Java 9๋ฒ„์ „ ์ดํ›„ : ClassLoader ๋‚ด ์ตœ์ƒ์œ„ ํด๋ž˜์Šค๋“ค๋งŒ ๋กœ๋”ฉ
    ์š”์ฒญํ•œ ํด๋ž˜์Šค๋ฅผ ์ฐพ๋Š”๋‹ค.

    ๋งŒ์•ฝ ํด๋ž˜์Šค๊ฐ€ ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์•„๋‹ˆ๋ผ๋ฉด ๋‹ค์‹œ Extension Loader์—๊ฒŒ ์š”์ฒญ์„ ์œ„์ž„ํ•œ๋‹ค.
  • Extension Loader๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Java ๋ฒ„์ „์— ๋งž๊ฒŒโ“ Java 8๋ฒ„์ „ : jre/lib/ext, java.ext.dirs
    Java 9๋ฒ„์ „ ์ดํ›„ : Java SE ๋ชจ๋“  ํด๋ž˜์Šค, JCP์— ์˜ํ•ด ํ‘œ์ค€ํ™”๋œ ๋ชจ๋“ˆ ๋‚ด์˜ ํด๋ž˜์Šค
    ํด๋ž˜์Šค๋ฅผ ์ฐพ๊ณ  ์žˆ๋‹ค๋ฉด ํด๋ž˜์Šค๋ฅผ ๋ฐ˜ํ™˜ ์•„๋‹ˆ๋ผ๋ฉด ์š”์ฒญ์„ Application Loader์—๊ฒŒ ์œ„์ž„ํ•œ๋‹ค.
  • Application Loader๋„ ๋™์ž‘์€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Classpath๐Ÿ’ฌ ํด๋ž˜์Šค ํŒŒ์ผ์„ ์ฐพ๋Š” ๋ฐ ๊ธฐ์ค€์ด ๋˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ๋งํ•œ๋‹ค.
    ์‹œ์Šคํ…œ์˜ ๋ชจ๋“  ํด๋”๋ฅผ JVM์ด ๊ฒ€์‚ฌํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๋น„ํ˜„์‹ค์ ์ด๋ฏ€๋กœ JVM์— ์ฐพ์•„๋ณผ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค.
    ์—์„œ ์š”์ฒญํ•œ ํด๋ž˜์Šค๋ฅผ ์ฐพ์€ ๋’ค ์žˆ๋‹ค๋ฉด ๋ฐ˜ํ™˜ ์—†๋‹ค๋ฉด ClassNotFoundException์ด ๋ฐœ์ƒํ•œ๋‹ค.

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

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

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


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

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

5-1. ๋กœ๋”ฉ

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

  • Class, Enum, Inteface๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ €์žฅํ•œ๋‹ค.
  • ๋กœ๋”ฉ์ด ๋๋‚˜๋ฉด ํ•ด๋‹น ํด๋ž˜์Šค ํƒ€์ž…์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด ๋ฉ”๋ชจ๋ฆฌ์˜ Heap์˜์—ญ์— ์ €์žฅํ•œ๋‹ค.
  • ๋™์  ๋กœ๋”ฉ : ๋ณธ๋ฌธ์˜ ์ฒ˜์Œ์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋Ÿฐํƒ€์ž„ ์ค‘ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ๋™์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์„œ ํšจ์œจ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ๋™์ž‘ ์ˆœ์„œ๋Š” ์ด ๊ธ€์˜ ์œ„์ž„ ๊ณ„์ธต์—์„œ ์„ค๋ช…ํ–ˆ์œผ๋ฏ€๋กœ ๋‹ค์‹œ ํ™•์ธํ•˜์ž.

5-2. ๋งํฌ

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

  • Verify(๊ฒ€์ฆ) - Prepare(์ค€๋น„) - Resolve(ํ•ด์„) ์˜ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • Verify
    • .class ํŒŒ์ผ์ด ์ž๋ฐ” ์–ธ์–ด ๋ช…์„ธ์„œ์— ๋”ฐ๋ผ ์ฝ”๋“œ๋ฅผ ์ œ๋Œ€๋กœ ์ž˜ ์ž‘์„ฑํ–ˆ๋Š”์ง€, JVM ๊ทœ๊ฒฉ์— ๋”ฐ๋ผ ๊ฒ€์ฆ๋œ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š”์ง€ ๋“ฑ์„ ํ™•์ธํ•ด ํŒŒ์ผ์˜ ์ •ํ™•์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
    • ๋งŒ์•ฝ ๊ฒ€์ฆ์ด ์‹คํŒจํ•œ๋‹ค๋ฉด java.lang.VerifyError์„ ๋ฐœ์ƒ์‹œ์ผœ ์œ ํšจํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์„ ๋ฏธ์—ฐ์— ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Prepare
    • ๋งค๋ชจ๋ฆฌ๋ฅผ ์ค€๋น„ํ•˜๋Š” ๋‹จ๊ณ„
    • Class ๋˜๋Š” Interface์— ํ•„์š”ํ•œ ์ •์  ํ•„๋“œ๋ฅผ ๋งŒ๋“ค๊ณ  ํ•ด๋‹น ํ•„๋“œ๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™” ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
      class ExampleClass {
        private static int a = 10;
      }
      

      ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด intํ˜• ์ •์  ๋ณ€์ˆ˜์ธ a์— 4byte์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™•๋ณดํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์ธ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.

    • ์œ„์˜ ์ž‘์—… ์ˆ˜ํ–‰์ค‘ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋ฉด java.lang.OutOfMemoryError์ด ๋ฐœ์ƒํ•œ๋‹ค.
  • Resolve
    • ํ•ด์„๋‹จ๊ณ„๋Š” ๋Ÿฐํƒ€์ž„ ์ƒ์ˆ˜ ํ’€(run-time constant pool)์— ์žˆ๋Š” ์‹ฌ๋ณผ๋ฆผ ์ฐธ์กฐ๋ฅผ ์ง์ ‘ ์ฐธ์กฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•œ๋‹ค.
    • JVM์˜ ๋ช…๋ น์–ด(anewarray, checkcast, getfield, getstatic, instanceof, invokedynamic, invokeinterface , invokespecial, invokestatic, invokevirtual, ldc, ldc_w, multianewarray, new, putfield ๋ฐ putstatic)๋Š” ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๋Ÿฌํ•œ ๋ช…๋ น์–ด๋ฅผ ํ•ด์„ํ•˜๋ ค๋ฉด ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ํ•ด์„ํ•ด์•ผํ•œ๋‹ค.
      class ConstantPoolExample{
        public void example(){
           System.out.println("constant pool");
        }
      }
      

      ์ด ์ฝ”๋“œ๋ฅผ ๋””์–ด์…ˆ๋ธ”๋Ÿฌ ๋ช…๋ น์–ด์ธ javap -v ์ด๋ฆ„.class ๋ฅผ ํ†ตํ•ด ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ถ„์„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
      #n์€ ์ƒ์ˆ˜ํ’€์˜ n๋ฒˆ ์ธ๋ฑ์Šค๋กœ ์ ‘๊ทผํ•˜๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ์ด๋‹ค.

      #1 = Methodref          #6.#14         // java/lang/Object."<init>":()V
      #2 = Fieldref           #15.#16        // java/lang/System.out:Ljava/io/PrintStream;
      #3 = String             #17            // constant pool
      #4 = Methodref          #18.#19        // java/io/PrintStream.println:(Ljava/lang/String;)V
      #5 = Class              #20            // ConstantPoolExample
      #6 = Class              #21            // java/lang/Object
      #7 = Utf8               <init>
      #8 = Utf8               ()V
      #9 = Utf8               Code
      #10 = Utf8               LineNumberTable
      #11 = Utf8               example
      #12 = Utf8               SourceFile
      #13 = Utf8               constant.java
      #14 = NameAndType        #7:#8          // "<init>":()V
      #15 = Class              #22            // java/lang/System
      #16 = NameAndType        #23:#24        // out:Ljava/io/PrintStream;
      #17 = Utf8               constant pool
      #18 = Class              #25            // java/io/PrintStream
      #19 = NameAndType        #26:#27        // println:(Ljava/lang/String;)V
      #20 = Utf8               ConstantPoolExample
      #21 = Utf8               java/lang/Object
      #22 = Utf8               java/lang/System
      #23 = Utf8               out
      #24 = Utf8               Ljava/io/PrintStream;
      #25 = Utf8               java/io/PrintStream
      #26 = Utf8               println
      #27 = Utf8               (Ljava/lang/String;)V
      

      ์œ„์˜ ์ƒ์ˆ˜ํ’€์˜ ์‹ฌ๋ณผ๋ฆญ ์ฐธ์กฐ๋ฅผ ์ง์ ‘์ฐธ์กฐ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.

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

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

  • ์ •์  ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ์— ๋ช…์‹œ๋œ ์›๋ž˜ ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค.
  • ์ดˆ๊ธฐํ™” ๋ธ”๋ก (static { })์ด ์‹คํ–‰๋œ๋‹ค.
  • ํด๋ž˜์Šค ๊ณ„์ธต๊ตฌ์กฐ์—์„œ ๋ถ€๋ชจ์—์„œ ์ž์‹๊นŒ์ง€ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋œ๋‹ค.
์ฐธ๊ณ ํ•œ ๋‚ด์šฉ์˜ ์ถœ์ฒ˜

ํƒœ๊ทธ: , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: