바인딩이란 무엇인가?
바인딩(Binding)은 메서드 호출과 해당 메서드의 실제 구현부를 연결하는 메커니즘입니다. 자바의 다형성(Polymorphism) 개념에 따르면 하나의 객체는 여러 가지 서로 다른 형태를 가질 수 있으며, 이 형태는 컴파일 시점 또는 런타임 시점에 결정될 수 있습니다.
메서드 호출과 구현 사이의 연결이 컴파일 시점에 확정되면 정적 바인딩(Static Binding), 런타임 시점에 확정되면 동적 바인딩(Dynamic Binding)이라고 부릅니다. 동적 바인딩은 객체(Object)를 기준으로 바인딩을 결정하는 반면, 정적 바인딩은 클래스의 타입과 필드를 기준으로 결정한다는 점이 핵심 차이입니다.
정적 바인딩과 동적 바인딩의 주요 차이점
| 번호 | 구분 | 정적 바인딩 | 동적 바인딩 |
|---|---|---|---|
| 1 | 기본 개념 | 컴파일 시점에 결정됨 | 런타임 시점에 결정됨 |
| 2 | 결정 방식 | 클래스의 타입과 필드를 사용 | 객체를 사용하여 결정 |
| 3 | 대표 예시 | 메서드 오버로딩(Overloading) | 메서드 오버라이딩(Overriding) |
| 4 | 적용 대상 | private, final, static 메서드 및 변수 | 가상(Virtual) 메서드 |
정적·동적 바인딩 예제 코드
public class FastFood {
public void create() {
System.out.println("Creating in FastFood class");
}
}
public class Pizza extends FastFood {
public void create() {
System.out.println("Creating in Pizza class");
}
}
public class Main {
public static void main(String[] args) {
FastFood fastFood = new FastFood();
fastFood.create();
// 동적 바인딩
FastFood pza = new Pizza();
pza.create();
}
}위 코드에서 fastFood.create()는 참조 변수와 실제 객체가 모두 FastFood 타입이므로 'FastFood 클래스에서 생성'이라는 문구가 출력됩니다. 반면 pza.create()처럼 부모 클래스 타입(FastFood)의 참조 변수가 자식 클래스(Pizza)의 객체를 가리킬 때는 동적 바인딩이 적용되어, 런타임에 실제 객체의 타입을 확인한 뒤 Pizza 클래스의 create() 메서드가 실행됩니다. 따라서 'Pizza 클래스에서 생성'이라는 문구가 화면에 나타납니다.
마무리 정리
private, final, static으로 선언된 메서드와 변수는 컴파일 시점에 호출 대상이 확정되므로 정적 바인딩이 적용되며, 오버라이딩된 일반 인스턴스 메서드는 런타임에 실제 객체 타입에 따라 호출 대상이 결정되므로 동적 바인딩이 적용됩니다. 두 바인딩 방식의 차이를 정확히 이해하면 자바의 다형성 원리와 오버로딩·오버라이딩의 동작 방식을 훨씬 명확하게 파악할 수 있습니다.