문제

초기 바인딩과 후기 바인딩의 차이점은 무엇입니까?

도움이 되었습니까?

해결책

간단히 대답하자면 초기(또는 정적) 바인딩은 컴파일 시간 바인딩을 참조하고 늦은(또는 동적) 바인딩은 런타임 바인딩(예: 리플렉션을 사용하는 경우)을 참조한다는 것입니다.

다른 팁

컴파일된 언어에서는 차이가 극명합니다.

자바:

//early binding:
public create_a_foo(*args) {
 return new Foo(args)
}
my_foo = create_a_foo();

//late binding:
public create_something(Class klass, *args) {
  klass.new_instance(args)
}
my_foo = create_something(Foo);

첫 번째 예에서 컴파일러는 컴파일 타임에 모든 종류의 깔끔한 작업을 수행할 수 있습니다.두 번째로, 이 방법을 사용하는 사람이 책임감 있게 사용하기를 바라기만 하면 됩니다.(물론 최신 JVM은 다음을 지원합니다. Class<? extends Foo> klass 이러한 위험을 크게 줄일 수 있는 구조입니다.)

또 다른 이점은 IDE가 클래스 정의에 핫링크될 수 있다는 점입니다. 클래스 정의는 메서드에서 바로 선언되기 때문입니다.create_something(Foo)에 대한 호출은 다음과 같을 수 있습니다. 매우 메소드 정의와는 거리가 멀고, 메소드 정의를 보고 있다면 구현을 보는 것도 좋을 것 같습니다.

후기 바인딩의 가장 큰 장점은 제어 역전과 같은 작업을 더 쉽게 할 뿐 아니라 다형성 및 오리 타이핑(언어에서 지원하는 경우)의 특정 용도를 더 쉽게 만들어준다는 것입니다.

에서 직접 가져옴 http://word.mvps.org/fAQs/InterDev/EarlyvsLateBinding.htm

자동화 (또는 OLE 자동화)를 사용하여 다른 응용 프로그램을 프로그래밍 방식으로 제어하는 ​​두 가지 방법이 있습니다.

늦은 바인딩은 CreateObject를 사용하여 응용 프로그램 객체의 생성 및 인스턴스를 사용하여 제어 할 수 있습니다.예를 들어, 늦은 바인딩을 사용하여 새로운 Excel 인스턴스를 생성합니다.

 Dim oXL As Object
 Set oXL = CreateObject("Excel.Application")

반면에, 기존의 Excel 인스턴스 (Excel이 이미 열려있는 경우)를 조작하려면 getObject를 사용합니다 (조기 또는 늦은 바인딩을 사용하든 관계없이).

 Dim oXL As Object
 Set oXL = GetObject(, "Excel.Application")

조기 바인딩을 사용하려면 먼저 프로젝트에서 조작하려는 응용 프로그램에 대한 참조를 설정해야합니다.모든 사무실 응용 프로그램의 VB 편집기 또는 VB 자체에서 도구 + 참조를 선택하고 목록에서 원하는 응용 프로그램을 선택하여이를 수행합니다 (예 :“Microsoft Excel 8.0 개체 라이브러리”).

초기 바인딩을 사용하여 Excel의 새 인스턴스를 만들려면 다음을 수행합니다.

 Dim oXL As Excel.Application
 Set oXL = New Excel.Application

두 경우 모두 우연히도 기존 Excel 인스턴스를 얻으려고 시도 할 수 있으며 오류를 반환하면 오류 핸들러에서 새 인스턴스를 만들 수 있습니다.

Herbert Schildt C++ 책의 유사하지만 더 자세한 답변은 다음과 같습니다.

초기 바인딩은 컴파일 타임에 발생하는 이벤트를 나타냅니다.본질적으로 초기 바인딩은 함수를 호출하는 데 필요한 모든 정보가 컴파일 타임에 알려질 때 발생합니다.(다르게 말하면, 초기 바인딩은 컴파일 중에 객체와 함수 호출이 바인딩된다는 의미입니다.) 초기 바인딩의 예로는 일반 함수 호출(표준 라이브러리 함수 포함), 오버로드된 함수 호출, 오버로드된 연산자가 있습니다.초기 바인딩의 주요 장점은 효율성입니다.함수를 호출하는 데 필요한 모든 정보는 컴파일 타임에 결정되므로 이러한 유형의 함수 호출은 매우 빠릅니다.

초기 바인딩의 반대는 후기 바인딩입니다.늦은 바인딩은 실행 시간까지 해결되지 않는 기능 호출을 말합니다.가상 함수는 후기 바인딩을 달성하는 데 사용됩니다.아시다시피, 기본 포인터나 참조를 통해 액세스하는 경우 실제로 호출되는 가상 함수는 포인터가 가리키는 개체 유형에 따라 결정됩니다.대부분의 경우 컴파일 타임에 이를 확인할 수 없기 때문에 개체와 함수는 런타임까지 연결되지 않습니다.후기 바인딩의 가장 큰 장점은 유연성입니다.초기 바인딩과 달리 늦은 바인딩을 사용하면 발생하는 이벤트에 응답 할 수있는 프로그램을 만들 수 있으며 프로그램은 많은 양의 "비상 코드"를 생성하지 않고 실행합니다. 런타임까지 함수 호출이 해결되지 않기 때문에 늦은 바인딩은 실행 시간이 약간 느리게 만들 수 있습니다.그러나 오늘날 빠른 컴퓨터는 런타임 바인딩과 관련된 실행 시간을 크게 줄였습니다.

해석된 언어에서는 차이가 좀 더 미묘합니다.

루비:

# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

Ruby는 (일반적으로) 컴파일되지 않기 때문에 멋진 사전 작업을 수행할 컴파일러가 없습니다.하지만 JRuby의 성장은 요즘 더 많은 Ruby가 컴파일되어 위의 Java처럼 작동하게 된다는 것을 의미합니다.

IDE의 문제는 여전히 남아 있습니다.Eclipse와 같은 플랫폼은 하드 코딩하면 클래스 정의를 찾을 수 있지만 호출자에게 맡기면 클래스 정의를 찾을 수 없습니다.

제어 역전은 Ruby의 런타임 유연성 때문에 별로 인기가 없습니다. 그러나 Rails는 애플리케이션을 실행하는 데 필요한 구성 양을 줄이기 위해 후기 바인딩을 잘 활용합니다.

public class child()
{    public void method1()
     {     System.out.println("child1");
     }
    public void method2()
     {     System.out.println("child2");
     }

}
public class teenager extends child()
{    public void method3()
     {      System.out.println("teenager3");
     }
}
public class adult extends teenager()
{     
    public void method1()
    {    System.out.println("adult1);
         super.method1();
     }
}


//In java
public static void main(String []args)
{    ((teenager)var).method1();
}

이렇게 출력됩니다

adult1
child1

조기 바인딩에서 컴파일러는 어린이와 십대의 모든 방법에 액세스하지만 (런타임에) 늦은 바인딩 (런타임)에서는 런타임에 재정의 된 메소드를 확인합니다.

따라서 방법 1 (아동 - 조기 바인딩)은 런타임 (늦은 바인딩)에서 성인의 방법 1에 의해 무시 될 것입니다.

하위에 method1이 없으면 기본 코드가 컴파일되지 않습니다.

컴파일 시간 다형성은 동작이 다른 동일한 메소드 이름을 가질 때 오버로딩, 초기 바인딩 또는 정적 바인딩이라고도 합니다.동일한 메서드의 여러 프로토타입을 구현하면 그 안에서 다른 동작이 발생합니다.초기 바인딩은 프로그램의 첫 번째 컴파일을 의미합니다.그러나 런타임에 바인딩 개체는 프로그램에서 런타임이 발생합니다.동적 바인딩, 재정의 또는 런타임 다형성이라고도 합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top