본문 바로가기
JAVA

메서드 동적 바인딩

by 영카이브 2024. 1. 19.

정적바인딩과 동적바인딩은 메서드 호출 위치의 결정 방식을 나타낸다.

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