λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

빈 ꡬ멍 μ±„μš°κΈ°

[Java] 클래슀 λ‘œλ“œ

좜처

ChatGPT

https://inpa.tistory.com/entry/JAVA-%E2%98%95-%ED%81%B4%EB%9E%98%EC%8A%A4%EB%8A%94-%EC%96%B8%EC%A0%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC%EC%97%90-%EB%A1%9C%EB%94%A9-%EC%B4%88%EA%B8%B0%ED%99%94-%EB%90%98%EB%8A%94%EA%B0%80-%E2%9D%93

 

β˜• ν΄λž˜μŠ€λŠ” μ–Έμ œ λ©”λͺ¨λ¦¬μ— λ‘œλ”© & μ΄ˆκΈ°ν™” λ˜λŠ”κ°€ ❓

JVM의 클래슀 λ‘œλ” (Class Loader) μžλ°”μ˜ ν΄λž˜μŠ€λ“€μ΄ μ–Έμ œ μ–΄λ””μ„œ λ©”λͺ¨λ¦¬μ— μ˜¬λΌκ°€κ³  클래슀 멀버듀이 μ΄ˆκΈ°ν™”λ˜λŠ”μ§€, 원리λ₯Ό μ•ŒκΈ°μœ„ν•΄μ„  μš°μ„  JVM(μžλ°” 가상 λ¨Έμ‹ )의 클래슀 λ‘œλ”(Class Loader)의 진행

inpa.tistory.com

 


 

"ν΄λž˜μŠ€κ°€ λ‘œλ“œλœλ‹€" 의 의미

μžλ°” ν”„λ‘œκ·Έλž¨μ΄ μ‹€ν–‰λ˜λŠ” λ™μ•ˆ JVM(Java Virtual Machine)이 클래슀 νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•΄ ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©ν•  μ€€λΉ„λ₯Ό ν•˜λŠ” 과정을 μ˜λ―Έν•œλ‹€.

이 과정은 클래슀의 λ°”μ΄νŠΈ μ½”λ“œκ°€ λ©”λͺ¨λ¦¬μ— 적재되고 μ΄ ν›„ μ‚¬μš©μžκ°€ 클래슀의 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•˜κ±°λ‚˜ 객체λ₯Ό 생성할 수 μžˆλŠ” μƒνƒœλ‘œ λ§Œλ“œλŠ” 일련의 단계듀을 ν¬ν•¨ν•œλ‹€.

 

클래슀 λ‘œλ”© κ³Όμ •

  1. 클래슀 λ‘œλ”© Class Loading
  2. 링킹 Linking
  3. μ΄ˆκΈ°ν™” Initialization
  4. μ‚¬μš© κ°€λŠ₯ μƒνƒœ

 

1. 클래슀 λ‘œλ”© Class Loading

 

- λ°”μ΄νŠΈ μ½”λ“œ 읽기

JVM은 클래슀 파일(*.class)μ—μ„œ λ°”μ΄νŠΈμ½”λ“œλ₯Ό 읽어듀인닀.

 

- λ‘œλ” κ²°μ •

JVM은 클래슀λ₯Ό λ‘œλ“œν•˜κΈ° μœ„ν•΄ μ‚¬μš©ν•  클래슀 λ‘œλ”λ₯Ό κ²°μ •ν•œλ‹€. 클래슀 λ‘œλ”λŠ” 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— μ μž¬ν•˜λŠ” 역할을 ν•œλ‹€.

클래슀 λ‘œλ“œ μ’…λ₯˜ μ„€λͺ…은 μ•„λž˜μ—

2. 링킹 Linking

- 검증 Verification

λ‘œλ“œλœ 클래슀 파일의 λ°”μ΄νŠΈμ½”λ“œκ°€ μœ νš¨ν•œμ§€ ν™•μΈν•œλ‹€. 이 λ‹¨κ³„μ—μ„œλŠ” λ©”λͺ¨λ¦¬ μΉ¨λ²” 방지, μŠ€νƒ 검증 λ“± λ³΄μ•ˆ 검사λ₯Ό μˆ˜ν–‰ν•œλ‹€.

 

- μ€€λΉ„ Preparation

ν΄λž˜μŠ€μ— μ„ μ–Έλœ λͺ¨λ“  정적 ν•„λ“œλ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  기본값을 μ„€μ •ν•œλ‹€.

 

- ν•΄κ²° Resolution

ν΄λž˜μŠ€κ°€ μ‚¬μš©ν•˜λŠ” λͺ¨λ“  심볼릭 레퍼런슀λ₯Ό μ‹€μ œ λ©”λͺ¨λ¦¬ μ£Όμ†Œλ‘œ λ³€κ²½ν•œλ‹€.

 

3. μ΄ˆκΈ°ν™” Initialization

- 정적 μ΄ˆκΈ°ν™” 블둝 및 정적 λ³€μˆ˜ μ΄ˆκΈ°ν™”

ν΄λž˜μŠ€μ— μ •μ˜λœ static μ΄ˆκΈ°ν™” 블둝과 static λ³€μˆ˜κ°€ 이 μ‹œμ μ—μ„œ μ΄ˆκΈ°ν™”λœλ‹€. μ΄ˆκΈ°ν™”λŠ” 클래슀의 정적 블둝이 μžˆλŠ” 경우 μ‹€ν–‰λ˜λ©°, κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” 기본값이 ν• λ‹Ήλœλ‹€.

 

- 클래슀 μƒμ„±μž μ‹€ν–‰

static ν•„λ“œμ— 초기 값을 μ„€μ •ν•˜κΈ° μœ„ν•œ 클래슀 μƒμ„±μž(<clinit> λ©”μ„œλ“œ)κ°€ ν˜ΈμΆœλœλ‹€.

 

예제

public class MyClass {
    static int staticValue = 10;

    static {
        staticValue = 20; // ν΄λž˜μŠ€κ°€ λ‘œλ“œλ  λ•Œ μ‹€ν–‰
        System.out.println("Static block executed");
    }
}

 

4. μ‚¬μš© κ°€λŠ₯ μƒνƒœ

μ΄ˆκΈ°ν™”κ°€ μ™„λ£Œλœ ν›„ ν΄λž˜μŠ€λŠ” μΈμŠ€ν„΄μŠ€ν™”μ‚¬ κ°€λŠ₯ν•œ μƒνƒœκ°€ λœλ‹€. 이 μƒνƒœμ—μ„œλŠ” 클래슀λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜ 객체λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ static λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆλ‹€.

 

예제

public class Example {
    static int count = 0;

    static {
        System.out.println("Class Example is loaded");
    }

    public static void printMessage() {
        System.out.println("Hello from Example");
    }

    public Example() {
        count++;
        System.out.println("Object created");
    }

    public static void main(String[] args) {
        // 클래슀 λ‘œλ”©: Example ν΄λž˜μŠ€λŠ” 여기에 처음 λ“±μž₯ν•˜λ―€λ‘œ λ‘œλ“œλ©λ‹ˆλ‹€.
        Example.printMessage(); // Static block이 λ¨Όμ € 싀행됨

        // 객체 생성: 이미 λ‘œλ“œλ˜μ—ˆμœΌλ―€λ‘œ λ°”λ‘œ 객체가 μƒμ„±λ©λ‹ˆλ‹€.
        Example obj1 = new Example();
        Example obj2 = new Example();
    }
}

 

클래슀 λ‘œλ”© μ‹œμ 

ν΄λž˜μŠ€κ°€ 처음 μ‚¬μš©λ  λ•Œ λ‘œλ“œλœλ‹€.

1. 클래슀의 μΈμŠ€ν„΄μŠ€ 생성 μ‹œ

클래슀둜 객체λ₯Ό 생성할 κ²½μš°μ΄λ‹€.

2. 클래슀의 정적 λ©”μ†Œλ“œ 호좜 μ‹œ

static ν‚€μ›Œλ“œκ°€ 뢙은 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•  경우

3. 클래슀의 정적 λ³€μˆ˜ ν• λ‹Ή μ‹œ

static ν‚€μ›Œλ“œκ°€ λΆ™κ³ , final ν‚€μ›Œλ“œλŠ” 뢙지 μ•Šμ€ λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•  경우

4. 클래슀의 μƒμˆ˜κ°€ μ•„λ‹Œ 정적 λ³€μˆ˜λ₯Ό μ‚¬μš©ν•  μ‹œ

static final λ³€μˆ˜κ°€ μƒμˆ˜μΌ κ²½μš°μ—λŠ” 클래슀 λ‘œλ“œκ°€ μΌμ–΄λ‚˜μ§€ μ•Šκ³ , static final λ³€μˆ˜κ°€ λŸ°νƒ€μž„μ— κ³„μ‚°λ˜λŠ” 값이면 클래슀 λ‘œλ“œμ™€ 클래슀 μ΄ˆκΈ°ν™”κ°€ μΌμ–΄λ‚œλ‹€.

 

1. static final λ³€μˆ˜κ°€ λŸ°νƒ€μž„μ— κ³„μ‚°ν•˜λŠ” 값일 경우, ν΄λž˜μŠ€κ°€ λ‘œλ“œλœλ‹€. 

public class MyClass {
    public static final int CONSTANT = new Random().nextInt();
}

 

public static final int VALUE = Math.max(10, 20);

 

  • 값이 μ‹€ν–‰ μ‹œμ μ— κ³„μ‚°λ˜μ–΄μ•Ό ν•˜λ―€λ‘œ, ν•΄λ‹Ή 클래슀λ₯Ό λ‘œλ“œν•˜κ³  μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•œλ‹€.

 

2. staic final λ³€μˆ˜κ°€ μƒμˆ˜μΌ 경우, ν΄λž˜μŠ€κ°€ λ‘œλ“œλ˜μ§€ μ•ŠλŠ”λ‹€. μ»΄νŒŒμΌλŸ¬κ°€ μƒμˆ˜ ν’€(constant pool)에 ν•΄λ‹Ή 값을 직접 λ„£μ–΄ μΈλΌμΈ(inline) μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€. 

public class MyClass {
    public static final int CONSTANT = 42;
}
  • 컴파일 νƒ€μž„ μƒμˆ˜λŠ” 컴파일 μ‹œμ μ— κ·Έ 값을 ν™•μ •ν•  수 μžˆλŠ” λ³€μˆ˜λ‘œ, 기본적으둜 λ‹€μŒκ³Ό 같은 νŠΉμ§•μ„ 가지고 μžˆλ‹€.
    • κΈ°λ³Έ νƒ€μž…(Primitive Type)μ΄λ‚˜ λ¬Έμžμ—΄μ΄μ–΄μ•Ό ν•œλ‹€.
    • μƒμˆ˜ ν‘œν˜„μ‹μœΌλ‘œ μ •μ˜λ˜μ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄, int = 5 + 3; 처럼 컴파일 μ‹œμ μ— κ·Έ 값을 μ•Œ 수 μžˆμ–΄μ•Ό ν•œλ‹€.
      • μƒμˆ˜ ν‘œν˜„μ‹ : 컴파일 μ‹œμ μ— κ·Έ 값을 κ²°μ •ν•  수 μžˆλŠ” ν‘œν˜„μ‹.
        • 예 1: λ¦¬ν„°λŸ΄ μƒμˆ˜ μ‚¬μš©
          • public static final int CONSTANT = 10;
        • 예 2: κΈ°λ³Έ νƒ€μž… κ°„μ˜ μ‚°μˆ  μ—°μ‚°
          • public static final int ANOTHER_CONSTANT = 5 + 3;
        • 예 3: κΈ°μ‘΄ μƒμˆ˜λ“€κ°„μ˜ μ—°μ‚°
          • public static final int CONSTANT_A = 4;
          • public static final int CONSTANT_B = CONSTANT_A * 2;
        • 예 4: λ¬Έμžμ—΄ κ²°ν•©
          • public static final String GREETING = "Hello, " + "World!";
  • μ΄λŸ¬ν•œ κ²½μš°μ— μ»΄νŒŒμΌλŸ¬λŠ” μƒμˆ˜μ˜ 값을 μ°Έμ‘°ν•  λ•Œ μ‹€μ œ λ³€μˆ˜λ₯Ό μ°Έμ‘°ν•˜μ§€ μ•Šκ³  μ§μ ‘ κ°’ 자체λ₯Ό μ½”λ“œμ— μ‚½μž…ν•œλ‹€. 이λ₯Ό 톡해 ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 속도가 빨라지고 λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ΄ 쀄어든닀. λ”°λΌμ„œ static final λ³€μˆ˜λ₯Ό μ‚¬μš©ν•˜λŠ” μ½”λ“œμ—μ„œλŠ” λ³€μˆ˜κ°€ μ„ μ–Έλœ ν΄λž˜μ— λŒ€ν•œ μ°Έμ‘°κ°€ λΆˆν•„μš”ν•˜κ²Œ λœλ‹€.

 

클래슀 λ‘œλ”©μ˜ μ’…λ₯˜

μžλ°”μ—μ„œ 클래슀 λ‘œλ”©μ€ 두 가지 μ£Όμš” λ°©μ‹μœΌλ‘œ 이루어진닀.

1. 정적 λ‘œλ”© Static Loading

일반적으둜 'new' ν‚€μ›Œλ“œλ‘œ μΈμŠ€ν„΄μŠ€λ₯Ό μƒμ„±ν•˜κ±°λ‚˜, static λ©”μ„œλ“œ/λ³€μˆ˜μ— μ ‘κ·Όν•  λ•Œ λ°œμƒν•œλ‹€.

ν”„λ‘œκ·Έλž¨ μ‹œμž‘ μ‹œμ μ— λͺ¨λ“  ν΄λž˜μŠ€κ°€ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜λŠ” 방식. JVM에 μ˜ν•΄ μžλ™μœΌλ‘œ λ‘œλ“œλœλ‹€. 일반적인 μƒν™©μ—μ„œλŠ” μžλ°” μ»΄νŒŒμΌλŸ¬κ°€ 미리 κ²°μ •λœ 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— 올리며, λͺ¨λ“  ν΄λž˜μŠ€μ™€ λ©”μ„œλ“œλŠ” ν”„λ‘œκ·Έλž˜λ―Έμ΄ μ‹œμž‘λ  λ–„λΆ€ν„° μ‚¬μš©ν•  μ€€λΉ„κ°€ λœλ‹€.

 

μ˜ˆμ‹œ

// Static loading example
Example obj = new Example(); // Example ν΄λž˜μŠ€κ°€ λ‘œλ“œλ¨

 

2. 동적 λ‘œλ”© Dynamic Loading

ν”„λ‘œκ·Έλž¨ μ‹€ν–‰ 쀑 νŠΉμ • μ‘°κ±΄μ΄λ‚˜ μš”κ΅¬μ‚¬ν•­μ— 따라 ν΄λž˜μŠ€κ°€ ν•„μš”ν•  λ•Œ κ·Έ λ•Œμ„œμ•Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜λŠ” 방식. 이 방식은 미리 μ•Œ 수 μ—†λŠ” ν΄λž˜μŠ€λ‚˜ μ™ΈλΆ€ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ 쒅속성을 μ²˜λ¦¬ν•  λ•Œ μ‚¬μš©λœλ‹€.

Reflection APIλ₯Ό μ‚¬μš©ν•΄ μ‹€ν–‰ μ‹œκ°„μ— 클래슀λ₯Ό λ‘œλ“œν•˜κ³  μΈμŠ€ν„΄μŠ€λ₯Ό 생성할 수 μžˆλ‹€. 

 

μ˜ˆμ‹œ

// Dynamic loading example
try {
    Class<?> clazz = Class.forName("com.example.DynamicClass");
    Object obj = clazz.getDeclaredConstructor().newInstance();
} catch (Exception e) {
    e.printStackTrace();
}

 

클래슀 λ‘œλ” Class Loader

JVMμ—λŠ” 클래슀 λ‘œλ”©μ„ μˆ˜ν–‰ν•˜λŠ” 클래슀 λ‘œλ”κ°€ μ‘΄μž¬ν•œλ‹€. 이듀은 클래슀 파일의 λ‘œλ”© 경둜 및 방식에 따라 κ΅¬λΆ„λœλ‹€.

1. λΆ€νŠΈμŠ€νŠΈλž© 클래슀 λ‘œλ” Bootstrap Class Loader

  • JRE κΈ°λ³Έ 클래슀(Java API, java.lang., java.util λ“±)λ₯Ό λ‘œλ“œν•œλ‹€.
  • λ„€μ΄ν‹°λΈŒ μ½”λ“œλ‘œ κ΅¬ν˜„λ˜μ–΄ 있으며, 'rt.jar' 파일의 λ‚΄μš©μ„ λ©”λͺ¨λ¦¬μ— μ˜¬λ¦°λ‹€.

2. ν™•μž₯ 클래슀 λ‘œλ” Extenstion Class Loader

  • JDK의 ν™•μž₯ 디렉토리인 'jre/lib/ext'에 μžˆλŠ” 클래슀λ₯Ό λ‘œλ“œν•œλ‹€.
  • 보톡 λΆ€νŠΈμŠ€λ₯΄λ°° 클래슀 λ‘œλ”μ— μ˜ν•΄ λ‘œλ“œλ˜μ§€ μ•Šμ€ 클래슀λ₯Ό λ‹΄λ‹Ήν•œλ‹€.

3. μ‹œμŠ€ν…œ 클래슀 λ‘œλ” System/Application Class Loader

  • μ‘μš© ν”„λ‘œκ·Έλž¨ 클래슀 경둜(classpath)에 μžˆλŠ” 클래슀λ₯Ό λ‘œλ“œν•œλ‹€.
  • μžλ°” ν”„λ‘œκ·Έλž¨μ΄ 싀행될 λ•Œ 기본적으둜 μ‚¬μš©λ˜λŠ” 클래슀 λ‘œλ”μ΄λ‹€.

 

클래슀 λ‘œλ”©μ˜ μ€‘μš”μ„±

λ©”λͺ¨λ¦¬ νš¨μœ¨μ„±

ν΄λž˜μŠ€λŠ” ν•„μš”ν•  λ•Œλ§Œ λ©”λͺ¨λ¦¬μ— λ‘œλ“œλ˜μ–΄ λ©”λͺ¨λ¦¬ μ‚¬μš©λŸ‰μ„ μ΅œμ ν™”ν•œλ‹€.

 

λ³΄μ•ˆ

클래슀 λ‘œλ”λŠ” λ°”μ΄νŠΈμ½”λ“œλ₯Ό κ²€μ¦ν•˜μ—¬ JVM의 μ•ˆμ „μ„±μ„ 보μž₯ν•œλ‹€. μ•…μ˜μ μΈ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜κΈ° 전에 차단할 수 μžˆλ‹€.

 

μœ μ—°μ„±

클래슀 λ‘œλ”λ₯Ό μ‚¬μš©ν•˜λ©΄ λ™μ μœΌλ‘œ 클래슀λ₯Ό λ‘œλ“œν•˜κ³ , μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ ν”ŒλŸ¬κ·ΈμΈ μ‹œμŠ€ν…œμ„ κ΅¬ν˜„ν•˜λŠ” 것이 κ°€λŠ₯ν•˜λ‹€.

 

 

 

 

μš”μ•½

"ν΄λž˜μŠ€κ°€ λ‘œλ“œλœλ‹€"λŠ” 것은 μžλ°” ν”„λ‘œκ·Έλž¨μ—μ„œ ν΄λž˜μŠ€κ°€ JVM에 μ˜ν•΄ λ©”λͺ¨λ¦¬λ‘œ μ½ν˜€μ Έ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœκ°€ λ˜λŠ” 과정을 μ˜λ―Έν•œλ‹€. 이 과정은 클래슀의 μ •μ˜λ₯Ό λ©”λͺ¨λ¦¬λ‘œ κ°€μ Έμ˜€κ³ , 정적 λ³€μˆ˜μ™€ λ©”μ„œλ“œλ₯Ό μ΄ˆκΈ°ν™”ν•˜λ©°, κ·Έ ν›„ 객체 μΈμŠ€ν„΄μŠ€κ°€ 생성될 수 μžˆλ„λ‘ μ€€λΉ„ν•˜λŠ” 것을 ν¬ν•¨ν•œλ‹€. 클래슀 λ‘œλ”©μ€ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘λΆ€ν„° 객체 생성에 이λ₯΄λŠ” 전체 단계 κ³Όμ •μ˜ ν•„μˆ˜ λ‹¨κ³„λ‘œ, 효율적이고 μ•ˆμ „ν•œ ν”„λ‘œκ·Έλž¨ 싀행을 μœ„ν•΄ μ€‘μš”ν•˜λ‹€.

 


ChatGPTμ—κ²Œ 이 κΈ€μ˜ 좜처λ₯Ό λ¬Όμ—ˆλ‹€.

클래슀 λ‘œλ”©μ— λŒ€ν•œ 좜처

  1. The Java Language Specification
    • λ‚΄μš©: 이 λ¬Έμ„œλŠ” μžλ°” μ–Έμ–΄μ˜ 곡식 사양을 μ„€λͺ…ν•˜λ©°, 클래슀 λ‘œλ”©κ³Ό μ΄ˆκΈ°ν™” 과정에 λŒ€ν•œ ꡬ체적인 정보λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. 클래슀 λ‘œλ”©μ€ λŸ°νƒ€μž„ μ‹œ 클래슀 νŒŒμΌμ„ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³ , 검증 및 μ€€λΉ„, 해석, μ΄ˆκΈ°ν™” 단계λ₯Ό κ±°μΉ˜λŠ” κ³Όμ •μž…λ‹ˆλ‹€.
    • μ„€λͺ…:
      • λ‘œλ“œ(Loading): 클래슀 νŒŒμΌμ„ 읽어 λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•©λ‹ˆλ‹€.
      • 링크(Linking):
        • 검증(Verification): 클래슀 파일의 ν˜•μ‹ 및 λ°”μ΄νŠΈμ½”λ“œμ˜ μœ νš¨μ„±μ„ κ²€μ¦ν•©λ‹ˆλ‹€.
        • μ€€λΉ„(Preparation): 클래슀 λ³€μˆ˜(static λ³€μˆ˜)λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•˜κ³  κΈ°λ³Έκ°’μœΌλ‘œ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
        • 해석(Resolution): 심볼릭 레퍼런슀λ₯Ό λ©”λͺ¨λ¦¬μ˜ μ‹€μ œ μ£Όμ†Œλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€.
      • μ΄ˆκΈ°ν™”(Initialization): 클래슀 λ³€μˆ˜μ˜ μ΄ˆκΈ°ν™” μ½”λ“œκ°€ μ‹€ν–‰λ©λ‹ˆλ‹€.
    • 링크: The Java Language Specification
  2. Java Virtual Machine Specification
    • λ‚΄μš©: 이 λ¬Έμ„œλŠ” JVM의 λ™μž‘ 원리와 λ©”λͺ¨λ¦¬ 관리, 클래슀 λ‘œλ”© λ©”μ»€λ‹ˆμ¦˜μ— λŒ€ν•œ μƒμ„Έν•œ μ„€λͺ…을 μ œκ³΅ν•©λ‹ˆλ‹€. 클래슀 λ‘œλ”(ClassLoader)λŠ” 클래슀 νŒŒμΌμ„ 읽어 λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³ , 클래슀λ₯Ό μ΄ˆκΈ°ν™”ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ΄ 싀행될 μ€€λΉ„λ₯Ό ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
    • μ„€λͺ…:
      • 클래슀 λ‘œλ”λŠ” 기본적으둜 Bootstrap ClassLoader, Extension ClassLoader, Application ClassLoader둜 κ΅¬λΆ„λ˜λ©°, 각각의 역할에 따라 클래슀λ₯Ό λ‘œλ“œν•©λ‹ˆλ‹€.
      • 클래슀 λ‘œλ”©μ€ 동적(dynamic)으둜 μˆ˜ν–‰λ˜λ©°, ν•„μš”ν•œ μ‹œμ μ— 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³  μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
    • 링크: Java Virtual Machine Specification
  3. "Inside the Java Virtual Machine" by Bill Venners
    • λ‚΄μš©: 이 책은 JVM의 λ‚΄λΆ€ ꡬ쑰와 λ™μž‘μ„ μ„€λͺ…ν•˜λ©°, 클래슀 λ‘œλ”© λ©”μ»€λ‹ˆμ¦˜κ³Ό λ©”λͺ¨λ¦¬ λͺ¨λΈμ„ μžμ„Ένžˆ λ‹€λ£Ήλ‹ˆλ‹€. 클래슀 λ‘œλ”© 과정은 JVM이 클래슀λ₯Ό μ–΄λ–»κ²Œ λ‘œλ“œν•˜κ³ , λ§ν¬ν•˜κ³ , μ΄ˆκΈ°ν™”ν•˜λŠ”μ§€λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.
    • μ„€λͺ…:
      • 클래슀 λ‘œλ”©μ€ JVM의 ClassLoaderκ°€ μˆ˜ν–‰ν•˜λ©°, 클래슀 파일의 λ°”μ΄νŠΈμ½”λ“œλ₯Ό 읽어 λ“€μ—¬ λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³ , ν”„λ‘œκ·Έλž¨μ΄ 싀행될 μ€€λΉ„λ₯Ό ν•©λ‹ˆλ‹€.
      • 클래슀 λ‘œλ”© 과정은 lazy loading 방식을 μ‚¬μš©ν•˜μ—¬, ν•„μš”ν•œ μ‹œμ μ—λ§Œ 클래슀λ₯Ό λ‘œλ“œν•˜μ—¬ λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ ν™”ν•©λ‹ˆλ‹€.
    • 링크: Inside the Java Virtual Machine on Amazon
  4. "Java Concurrency in Practice" by Brian Goetz
    • λ‚΄μš©: 이 책은 μžλ°”μ—μ„œμ˜ λ™μ‹œμ„± λ¬Έμ œμ™€ ν•΄κ²° 방법을 μ„€λͺ…ν•˜λ©°, 클래슀 λ‘œλ”©μ΄ λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μ–΄λ–»κ²Œ μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰λ˜λŠ”μ§€λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.
    • μ„€λͺ…:
      • 클래슀 λ‘œλ”©μ€ μžλ°”μ˜ 클래슀 λ‘œλ”μ— μ˜ν•΄ κ΄€λ¦¬λ˜λ©°, λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œλ„ μ•ˆμ „ν•˜κ²Œ μˆ˜ν–‰λ˜λ„λ‘ μ„€κ³„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
      • 클래슀 λ‘œλ”© κ³Όμ •μ—μ„œ λ°œμƒν•  수 μžˆλŠ” race condition을 λ°©μ§€ν•˜κΈ° μœ„ν•΄ 동기화 λ©”μ»€λ‹ˆμ¦˜μ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
    • 링크: Java Concurrency in Practice on Amazon
  5. "Java Performance: The Definitive Guide" by Scott Oaks
    • λ‚΄μš©: 이 책은 μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯ μ΅œμ ν™”λ₯Ό μœ„ν•œ λ‹€μ–‘ν•œ 기법을 μ„€λͺ…ν•˜λ©°, 클래슀 λ‘œλ”©κ³Ό κ΄€λ ¨λœ μ„±λŠ₯ 이슈λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.
    • μ„€λͺ…:
      • 클래슀 λ‘œλ”©μ€ JVM μ„±λŠ₯에 직접적인 영ν–₯을 미치며, 효율적인 클래슀 λ‘œλ”© μ „λž΅μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯을 κ°œμ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
      • **클래슀 데이터 곡유(Class Data Sharing, CDS)**와 같은 기법을 μ‚¬μš©ν•˜μ—¬ 클래슀 λ‘œλ”© μ‹œκ°„μ„ 쀄이고, λ©”λͺ¨λ¦¬ μ‚¬μš©μ„ μ΅œμ ν™”ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • 링크: Java Performance on Amazon