정적바인딩과 동적바인딩은 메서드 호출 위치의 결정 방식을 나타낸다.
C는 정적바인딩 / Java는 동적바인딩에 해당한다.
정적바인딩
- 정적바인딩은 컴파일 시간에 메서드 호출 위치가 결정된다.
- 컴파일러는 변수의 타입을 기반으로 어떤 메서드를 호출할지 결정하고 이 정보는 컴파일 시간에 확정된다.
- 메서드 오버라이딩이 발생해도 객체의 실제 타입이 아니라 참조 변수의 선언 타입을 기준으로 호출한다.
- 정적바인딩은 메서드의 오버로딩에도 적용된다.
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Dog barking");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 참조 변수의 선언 타입은 Animal
animal.makeSound(); // 정적 바인딩: Animal 클래스의 makeSound() 호출
}
}
- Animal animal = new Dog();에서 animal 변수는 Animal 타입으로 선언되었지만 객체는 Dog 클래스의 인스턴스이다.
- 그럼에도 불구하고 animal.makeSound()를 호출하면 Animal 클래스의 makeSound() 메서드가 호출된다.
동적바인딩
- 동적바인딩은 실행 시간에 메서드 위치가 결정된다.
- 객체의 실제 타입을 기반으로 어떤 메서드를 호출할지 결정하며, 이 정보는 실행시간에 동적으로 확인된다.
- 메서드 오버라이딩이 발생하면 객체의 실제 타입을 기준으로 호출된다.
class Animal {
void makeSound() {
System.out.println("Animal sound");
}
}
class Dog extends Animal {
void makeSound() {
System.out.println("Dog barking");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog(); // 참조 변수의 선언 타입은 Animal, 객체의 실제 타입은 Dog
animal.makeSound(); // 동적 바인딩: Dog 클래스의 makeSound() 호출
}
}
- Animal animal = new Dog();에서 animal은 Animal 타입으로 선언되었지만, 객체는 Dog 클래스의 인스턴스이다.
- animal.makeSound();에서 호출되는 makeSound() 메서드는 동적으로 실제 객체의 타입에 따라 결정된다.
- 참고 ) 객체의 실제 타입은 객체가 메모리에 생성될 때 사용된 클래스의 타입을 말한다. 클래스는 객체를 만들기 위한 틀이며, 클래스의 인스턴스(객체)가 생성될 때 해당 객체의 타입은 클래스의 타입이 된다.
참고 자료 출처 : https://www.youtube.com/watch?v=jlA2aYDktiQ
'JAVA' 카테고리의 다른 글
다형성과 형변환 (0) | 2024.01.27 |
---|---|
탬플릿 메서드 패턴 & 팩토리 메서드패턴 (0) | 2024.01.24 |
참조형식과 호출되는 메소드 관계 (0) | 2024.01.18 |
IS A 상속 (0) | 2024.01.16 |
코드 재사용 (0) | 2024.01.14 |