정적 바인딩

  • 컴파일 시점에 호출할 메서드가 결정
  • private, static, final 메서드는 정적 바인딩 적용
  • 오버라이딩 불가능 -> 숨김 발생
class Animal {
    static void staticMethod() {
        System.out.println("Animal의 staticMethod");
    }
}

class Dog extends Animal {
    static void staticMethod() { // 오버라이딩(X) → 숨김(Hiding)
        System.out.println("Dog의 staticMethod");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 업캐스팅
        animal.staticMethod(); // "Animal의 staticMethod"
    }
}

 

숨김(Hiding)의 동작 원리

  • static 메서드는 객체가 아니라 "변수 타입"에 따라 실행할 메서드 결정
  • 자식 클래스에서 동일한 이름의 static/private 메서드를 선언하면 부모 클래스의 메서드를 오버라이딩 하지 않고, 새로운 static 메서드 정의

동적 바인딩 

  • 런타임(실행) 시점에 호출할 메서드가 결정
  • 인스턴스 메서드는 동적 바인딩 적용
  • 오버라이딩 발생
  • 슈퍼 클래스 메소드의 접근 지정자보다 접근의 범위를 좁혀서 오버라이딩할 수 없음 (public > protected > default > private)
class Animal {
    void makeSound() { System.out.println("동물이 소리를 냅니다."); }
}

class Dog extends Animal {
    @Override
    void makeSound() { System.out.println("멍멍!"); }
}

public class Main {
    public static void main(String[] args) {
        Animal animal = new Dog(); // 업캐스팅
        animal.makeSound(); // "멍멍!" (동적 바인딩)
    }
}

 

동적 바인딩의 동작 원리

내부 구조

  • 가상 메서드 테이블(Virtual Method Table, V-Table) 구조를 이용해 동적 바인딩 구현
  • V-Table에는 해당 클래스에서 오버라이딩된 메서드의 주소가 저장됨
  • 객체가 생성되면, JVM은 V-Table을 참조해서 오버라이딩된 메서드를 실행

 

 


정적 바인딩 vs 동적 바인딩 정리

☝️ private 변수 자체는 정적 바인딩이지만, getter, setter를 통해 접근하기 때문에 결과적으로는 동적 바인딩이 이루어짐