μ μ²κΈ° μ€κΈ° μν μ§ν μμ ν΄λμ€ μμ±μ νΈμΆ μ μ΄λ€μ§λ μΌλ ¨μ κ³Όμ μ λν΄ μμ보λ€κ° λμ λμ€ν¨μΉ(Dynamic Dispatch) κ°λ μ λν΄ μκ² λμλ€.
μ²μμλ μ€λ²λΌμ΄λ©λ λ©μλκ° μ μμ ν΄λμ€ κΈ°μ€μΌλ‘ νΈμΆλλ κ±ΈκΉ? νλ λ¨μν κΆκΈμ¦μμ μΆλ°νκ³ JVM λ΄λΆμμ μ€μ λ‘ μ΄λ»κ² λ©μλκ° νΈμΆλλμ§, νΉν λ°νμμ μ΄λ€ λ°©μμΌλ‘ μ€μ λ©μλ ꡬνμ κ²°μ νλμ§μ λν΄ κΆκΈμ¦μ΄ μκ²Όλ€.
JVMμ λ΄λΆ ꡬ쑰, νΉν λ©μλ νΈμΆ μ μ΄λ€ λ°©μμΌλ‘ μ€μ ꡬν체λ₯Ό μ°Ύμκ°λμ§μ λν κ°λ μ μ 리νλ©΄μ μ μ λμ€ν¨μΉ vs λμ λμ€ν¨μΉ, κ·Έλ¦¬κ³ μ΄λ₯Ό κ°λ₯νκ² νλ vtable(κ°μ λ©μλ ν μ΄λΈ) ꡬ쑰κΉμ§ μμλ³΄κ³ μ 리ν΄λ³΄μ
μλ°μμ μ½λκ° μ€νλ λ, JVMμ ν΄λμ€λ₯Ό λ©λͺ¨λ¦¬μ λ‘λνκ³ λ©μλλ₯Ό μ€ννλ€.
μ΄λ μ΄λ€ λ©μλλ₯Ό νΈμΆν μ§ JVMμ΄ κ²°μ νλ λ°©μμλ λ κ°μ§κ° μλ€:
μ μ λμ€ν¨μΉ (Static Dispatch) | μ»΄νμΌ νμμ λ©μλ κ²°μ | μ»΄νμΌ νμ |
---|---|---|
λμ λμ€ν¨μΉ (Dynamic 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 λ©μλλ ν΄λμ€ νμ κΈ°μ€, μ€λ²λ‘λ©μ μΈμμ νμ μ κΈ°μ€μΌλ‘ μ»΄νμΌ νμμ κ²°μ