πŸ“˜ INTRO

μ •μ²˜κΈ° μ‹€κΈ° μ‹œν—˜ 직후 μžμ‹ 클래슀 μƒμ„±μž 호좜 μ‹œ μ΄λ€„μ§€λŠ” 일련의 과정에 λŒ€ν•΄ μ•Œμ•„λ³΄λ‹€κ°€ 동적 λ””μŠ€νŒ¨μΉ˜(Dynamic Dispatch) κ°œλ…μ— λŒ€ν•΄ μ•Œκ²Œ λ˜μ—ˆλ‹€.

μ²˜μŒμ—λŠ” μ˜€λ²„λΌμ΄λ”©λœ λ©”μ„œλ“œκ°€ μ™œ μžμ‹ 클래슀 κΈ°μ€€μœΌλ‘œ ν˜ΈμΆœλ˜λŠ” 걸까? ν•˜λŠ” λ‹¨μˆœν•œ κΆκΈˆμ¦μ—μ„œ μΆœλ°œν–ˆκ³  JVM λ‚΄λΆ€μ—μ„œ μ‹€μ œλ‘œ μ–΄λ–»κ²Œ λ©”μ„œλ“œκ°€ ν˜ΈμΆœλ˜λŠ”μ§€, 특히 λŸ°νƒ€μž„μ— μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ‹€μ œ λ©”μ„œλ“œ κ΅¬ν˜„μ„ κ²°μ •ν•˜λŠ”μ§€μ— λŒ€ν•΄ ꢁ금증이 생겼닀.

JVM의 λ‚΄λΆ€ ꡬ쑰, 특히 λ©”μ„œλ“œ 호좜 μ‹œ μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ‹€μ œ κ΅¬ν˜„μ²΄λ₯Ό μ°Ύμ•„κ°€λŠ”μ§€μ— λŒ€ν•œ κ°œλ…μ„ μ •λ¦¬ν•˜λ©΄μ„œ 정적 λ””μŠ€νŒ¨μΉ˜ vs 동적 λ””μŠ€νŒ¨μΉ˜, 그리고 이λ₯Ό κ°€λŠ₯ν•˜κ²Œ ν•˜λŠ” vtable(가상 λ©”μ„œλ“œ ν…Œμ΄λΈ”) κ΅¬μ‘°κΉŒμ§€ μ•Œμ•„λ³΄κ³  μ •λ¦¬ν•΄λ³΄μž


βœ…Β JVMμ—μ„œ λ©”μ„œλ“œλŠ” μ–΄λ–»κ²Œ ν˜ΈμΆœλ˜λ‚˜?

μžλ°”μ—μ„œ μ½”λ“œκ°€ 싀행될 λ•Œ, JVM은 클래슀λ₯Ό λ©”λͺ¨λ¦¬μ— λ‘œλ“œν•˜κ³  λ©”μ„œλ“œλ₯Ό μ‹€ν–‰ν•œλ‹€.

μ΄λ•Œ μ–΄λ–€ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν• μ§€ JVM이 κ²°μ •ν•˜λŠ” λ°©μ‹μ—λŠ” 두 κ°€μ§€κ°€ μžˆλ‹€:

πŸŒ€ λ©”μ„œλ“œ 호좜 방식 두 κ°€μ§€

정적 λ””μŠ€νŒ¨μΉ˜ (Static Dispatch) 컴파일 νƒ€μž„μ— λ©”μ„œλ“œ κ²°μ • 컴파일 νƒ€μž„
동적 λ””μŠ€νŒ¨μΉ˜ (Dynamic Dispatch) λŸ°νƒ€μž„μ— μ‹€μ œ 객체 νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ λ©”μ„œλ“œ κ²°μ • λŸ°νƒ€μž„

βš™οΈ 정적 λ””μŠ€νŒ¨μΉ˜ (Static Dispatch)

μ˜€λ²„λ‘œλ”©, static λ©”μ„œλ“œ 등은

정적(Static)

class Printer {
    void print(int x) {
        System.out.println("int: " + x);
    }
    void print(String x) {
        System.out.println("String: " + x);
    }

    static void hello() {
        System.out.println("Hello from static");
    }
}
Printer p = new Printer();
p.print(10);       // 컴파일 νƒ€μž„μ— κ²°μ • β†’ int 버전
p.print("hello");  // 컴파일 νƒ€μž„μ— κ²°μ • β†’ String 버전
Printer.hello();   // 클래슀 κΈ°μ€€μœΌλ‘œ 호좜

static λ©”μ„œλ“œλŠ” 클래슀 νƒ€μž… κΈ°μ€€, μ˜€λ²„λ‘œλ”©μ€ 인자의 νƒ€μž…μ„ κΈ°μ€€μœΌλ‘œ 컴파일 νƒ€μž„μ— κ²°μ •