조기 바인딩과 후기 바인딩의 차이점은 무엇입니까?
조기 바인딩과 후기 바인딩의 차이점은 무엇입니까?
답변:
짧은 대답은 초기 (또는 정적) 바인딩은 컴파일 시간 바인딩을 의미하고 후기 (또는 동적) 바인딩은 런타임 바인딩 (예 : 리플렉션을 사용할 때)을 참조한다는 것입니다.
컴파일 된 언어에서는 그 차이가 극명합니다.
자바:
//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")
초기 바인딩을 사용하려면 먼저 프로젝트에서 조작하려는 애플리케이션에 대한 참조를 설정해야합니다. Office 응용 프로그램의 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와 같은 플랫폼은 하드 코딩하면 클래스 정의를 조회 할 수 있지만 호출자에게 맡기면 불가능합니다.
Inversion-of-control은 아마도 극도의 런타임 유연성 때문에 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
초기 바인딩에서 컴파일러는 child 및 teenager의 모든 메서드에 액세스 할 수 있지만 런타임에 늦은 바인딩에서는 런타임에 재정의 된 메서드를 확인합니다.
따라서 method1 (from child-early binding)은 런타임에 성인의 method1에 의해 재정의 될 것입니다 (late binding). 그러면 십대의 method1에 method1이 없기 때문에 child로부터 method1을 구현할 것입니다.
child에 method1이 없으면 main의 코드가 컴파일되지 않습니다.
컴파일 시간 다형성은 동작이 다른 동일한 메서드 이름이있을 때 오버로딩 또는 초기 바인딩 또는 정적 바인딩이라고도합니다. 동일한 메서드의 여러 프로토 타입을 구현하면 다른 동작이 발생합니다. 초기 바인딩은 프로그램의 첫 번째 컴파일을 의미합니다. 그러나 후기 바인딩 개체는 프로그램에서 런타임이 발생합니다. 동적 바인딩 또는 재정의 또는 런타임 다형성이라고도합니다.