정적 바인딩
- 컴파일 시점에 호출할 메서드가 결정됨
- 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를 통해 접근하기 때문에 결과적으로는 동적 바인딩이 이루어짐
'언어, 프레임워크 > Java' 카테고리의 다른 글
implements / extends (0) | 2025.03.04 |
---|---|
인터페이스 내부 요소 (0) | 2025.03.04 |
Arrays 클래스의 메서드 (0) | 2025.03.03 |
불변 객체의 필요성 / 래퍼 클래스의 캐싱 동작 원리 (1) | 2025.03.03 |
Wrapper 클래스들의 공통 메서드 / 개별 메서드 (0) | 2025.03.02 |