JavaRush /Java Blog /Random-KO /Java의 초기 바인딩과 후기 바인딩의 차이점

Java의 초기 바인딩과 후기 바인딩의 차이점

Random-KO 그룹에 게시되었습니다
Java의 초기(정적) 바인딩 과 후기(동적) 바인딩 의 차이점을 이해하려면 먼저 바인딩이 무엇인지 이해해야 합니다 . 연결이란 링크와 코드가 연결되어 있음을 의미합니다. 예를 들어, 참조하는 변수는 해당 변수가 정의된 코드에 바인딩됩니다. 마찬가지로 호출되는 메서드는 해당 메서드가 정의된 코드의 위치에 바인딩됩니다.
Java의 초기 바인딩과 후기 바인딩의 차이점 - 1
Java 언어에는 초기 바인딩(정적이라고도 함)과 후기 바인딩 (각각 동적)이라는 두 가지 유형의 메서드 바인딩이 있습니다 . Java에서 메소드를 호출한다는 것은 프로그램이 실행되고 객체가 생성될 때 컴파일 타임이나 런타임에 메소드가 특정 코드에 바인딩된다는 것을 의미합니다. 이름에서 알 수 있듯이 정적 링크는 컴파일 타임에 발생하기 때문에 본질적으로 더 정적입니다. 즉, 코드는 Java 소스 코드를 클래스 파일로 컴파일한 후 호출할 메서드를 "알고 있습니다". 그리고 이는 프로그램 라이프사이클의 초기 단계를 의미하므로 초기 바인딩이라고도 합니다. 반면 동적 연결은 프로그램이 Java Virtual Machine에 의해 실행된 후 런타임에 발생합니다. 이 경우 호출할 메서드는 특정 개체에 따라 결정되므로 개체는 런타임에 생성되므로 컴파일 타임에는 정보를 사용할 수 없습니다. 그리고 이는 프로그램 수명 주기의 후반부에 발생하므로 Java에서는 이를 후기 바인딩이라고 합니다.
따라서 Java에서 정적 바인딩과 동적 바인딩의 근본적인 차이점은 전자는 참조 변수의 유형을 기반으로 컴파일 타임에 일찍 발생하고 후자는 런타임에 구체적인 개체를 사용하여 나중에 발생한다는 것입니다.
이를 더 잘 이해하고 Java 인터뷰에서 자주 묻는 질문에 답할 수 있도록 몇 가지 차이점을 더 살펴보겠습니다.

Java의 초기 및 후기 바인딩

Java의 정적 바인딩과 동적 바인딩에는 많은 차이점이 있지만 가장 중요한 것은 JVM이 이를 사용하는 방법입니다. 범위에 동일한 이름을 가진 메서드가 두 개 이상 있을 때 JVM이 어떤 메서드를 호출할지 결정하는 방법에 대해 궁금한 적이 있습니까? 메소드 오버로딩이나 오버라이딩을 사용해 본 적이 있다면 Java에서 동일한 이름을 가진 여러 메소드를 가질 수 있다는 것을 알고 있을 것입니다. Java의 경우 JVM은 정적 바인딩과 동적 바인딩을 모두 사용하여 원하는 방법을 선택합니다.

Java의 정적 및 동적 바인딩 예

이 프로그램에서는 정적 바인딩을 사용하여 컴파일 타임에 가상 메서드 바인딩이 발생하지 않는다는 것을 알 수 있습니다. 이는 초기에 바인딩된 정적 메서드에서 발생하는 것처럼 슈퍼클래스에서 메서드를 호출하기 때문입니다. 하위 클래스의 메서드가 호출되면 런타임에 특정 개체를 사용하여 함수를 바인딩하므로 동적 바인딩을 사용하여 가상 함수를 바인딩합니다.
public class Main {
  public static void main(String[] args) {

    // Пример статического и динамического связывания в Java
    Insurance current = new CarInsurance();

    // Динамическое связывание на основе an object
    int premium = current.premium();

    // Статическое связывание на основе класса
    String category = current.category();

    System.out.println("premium : " + premium);
    System.out.println("category : " + category);
  }
}

class Insurance{
  public static final int LOW = 100;

  public int premium(){
    return LOW;
  }

  public static String category(){
    return "Insurance";
  }

}

class CarInsurance extends Insurance{
  public static final int HIGH = 200;

  public int premium(){
    return HIGH;
  }

  public static String category(){
    return "Car Insurance";
  }

}
Результаты выполнения:

premium : 200
category : Insurance
보시다시피, 메서드 호출로 premium()인해 하위 클래스의 메서드가 실행되고, 메서드 호출로 category()인해 슈퍼클래스 메서드가 실행됩니다. premium()-는 후기 바인딩을 사용하여 확인되는 가상 메서드이고, category()-는 클래스 이름별로 컴파일 타임 정적 바인딩을 사용하여 확인되는 정적 메서드이기 때문입니다 .
Java에 대해 읽고 싶으십니까? Java 개발자 그룹에 가입하세요 !

Java의 초기 바인딩과 후기 바인딩의 차이점

이제 Java가 메소드 호출을 바인딩하는 방법과 정적 및 동적 바인딩이 작동하는 방법을 살펴보았으므로 Java의 초기 바인딩과 후기 바인딩 간의 주요 차이점을 요약해 보겠습니다.
  1. 정적 링크는 컴파일 타임에 발생하고 동적 링크는 런타임에 발생합니다.

  2. 정적 링크는 프로그램 라이프사이클 초기에 발생하므로 이를 조기 바인딩이라고 합니다. 마찬가지로 동적 바인딩은 프로그램 실행 후반에 발생하므로 후기 바인딩이라고도 합니다.

  3. 정적 바인딩은 Java 언어에서 오버로드된 메서드를 해결하는 데 사용되는 반면 동적 바인딩은 Java 언어에서 재정의된 메서드를 해결하는 데 사용됩니다.

  4. 마찬가지로 프라이빗, 정적 및 터미널 메서드는 재정의할 수 없으므로 정적 바인딩을 사용하여 확인되는 반면, 모든 가상 메서드는 동적 바인딩을 사용하여 확인됩니다.

  5. 정적 바인딩의 경우 구체적인 객체를 사용하는 것이 아니라, 타입 정보, 즉 참조 변수의 타입을 이용하여 원하는 메소드를 찾는다. 반면 동적 바인딩은 특정 개체를 사용하여 Java에서 원하는 메서드를 찾습니다.
다음은 Java의 정적 및 동적 바인딩 개념을 기반으로 한 좋은 연습입니다. "다음 프로그램이 실행될 때 무엇이 ​​출력될 것인가?"라는 질문에 답할 수 있습니까?
Java - 2의 초기 바인딩과 후기 바인딩의 차이점
이 프로그램은 무엇을 출력할까요? Collection, Set또는 HashSet? 이것이 우리가 Java의 초기(정적) 바인딩 과 후기(동적) 바인딩 간의 차이점에 대해 설명하고 싶었던 전부입니다 . 이것은 후보자의 지식 깊이를 테스트할 수 있는 많은 기회를 제공하기 때문에 최고의 Java 전화 인터뷰 질문 중 하나입니다. private , staticfinal 메소드는 정적 링크를 사용하여 바인딩되는 반면, 가상 메소드는 동적 링크를 사용하여 바인딩된다는 점을 항상 기억하십시오 . 마찬가지로 정적 바인딩의 가장 좋은 예는 메서드 오버로딩이고 재정의는 동적입니다. 원천
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION