바인딩이란?
- 변수에 구체적인 값을 할당하는 과정
- 메소드를 호출할 때 그 메소드가 위치한 메모리 주소로 연결하는 과정
정적 바인딩, 동적 바인딩
- 정적 바인딩은 컴파일러에 의해 컴파일 타임에 결정. 즉, 정적 바인딩으로 메소드를 호출 하는 것은 이미 JVM의 클래스 로더 시스템이 동작할 때 메소드의 메모리 주소로 연결이 되어 있는 것
- private, final and static members(methods and variables) — 정적 바인딩
- virtual methods — 동적 바인딩. run time object에 기반하여 binding이 진행됨
- 정적 바인딩은 Type(형)을 보고 바인딩이 진행되고 동적 바인딩은 런타임 시의 객체를 사용해서 바인딩을 진행함
- Overloaded 메서드는 정적 바인딩을 통해 호출이 되고 Overridden method는 동적 바인딩을 통해 호출이 됨
class Polymorphism { public static void main(String[] args) { SuperClass var = new SubClass(); // Promotion : 자동 타입변환, Pholymorphism // 동적 바인딩(Dynamic Binding) var.methodA(); // Runtime 시에 결정된다. SubClass의 메서드 호출 // 정적 바인딩(Static Binding) var.staticMethodA(); // static 메서드는 compile 시에 결정, SuperClass의 메서드 호출 } } class SuperClass { public void methodA(); public static void staticMethodA(); } class SubClass extends SuperClass { @Override void methodA() { System.out.println("SubClass"); } /* * 아래 코드는 Error 발생 * static 으로 선언된 메서드는 오버라이딩 불가능 */ @Override static void staticMethodA() { System.out.println("SubClass"); } }
- static 키워드가 붙은 부분들은 JVM에서 객체가 생성되기 전에 먼저 메모리에 올리기 때문에, 런타임 전에 이미 생성되어 있음
- 또한 static, final, private member들은 정적으로 바인딩이 되기 때문에 컴파일 시점에 해당 변수의 형을 보고 호출할 메서드가 결정됨