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


81

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



4
Early = 직접 함수 호출, late = 함수 포인터를 통해 함수 호출이라고 말하는 것이 잘못입니까? 프로그래머가 단순한 개념을 취하고 그것들을 (지능의 표시로?) 훨씬 더 복잡하게 보이게 만드는 방법을 가지고 있다는 사실은 나를 계속 놀라게합니다. 프로그래밍은 본질적으로 플로트 유형이 만들어지는 방법이나 컴파일러 개발과 같은 작업을 수행하기 전까지는 매우 쉬운 연구 분야입니다.
Bob Blogge 2013

답변:


57

짧은 대답은 초기 (또는 정적) 바인딩은 컴파일 시간 바인딩을 의미하고 후기 (또는 동적) 바인딩은 런타임 바인딩 (예 : 리플렉션을 사용할 때)을 참조한다는 것입니다.


8
그러나 후기 바인딩에 대한 위키피디아 기사 ( en.wikipedia.org/wiki/Late_binding )는 "늦은 바인딩은 종종 동적 디스패치와 혼동되지만 상당한 차이가 있습니다"라고 말합니다. 그래서 그들은 같습니까? 동일하다면 위키 백과 페이지를 변경해야합니다.
Alexander Bird


18

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

자바:

//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)에 대한 호출 은 메서드 정의에서 매우 멀리 떨어져 있을 수 있으며 메서드 정의를보고있는 경우 구현을 보는 것이 좋을 수 있습니다.

후기 바인딩의 가장 큰 장점은 제어 역전과 같은 것을 더 쉽게 만들뿐만 아니라 다형성 및 덕 타이핑의 다른 특정 사용을 가능하게한다는 것입니다 (언어가 그러한 것을 지원하는 경우).


6

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 인스턴스를 가져 오려고 할 수 있으며 오류가 반환되면 오류 처리기에서 새 인스턴스를 만들 수 있습니다.


3
이 답변은 오래되었고 다른 곳에서 가져온 것이지만 정확하지 않습니다. 후기 바인딩은 CreateObject 사용을 의미하지만 CreateObject가 반드시 후기 바인딩을 의미하는 것은 아닙니다. 바인딩은 개체를 인스턴스화하는 방법에는 적용되지 않고 선언 된 방법에만 적용됩니다. 개체를 "As Excel.Application"으로 선언하는 경우 인스턴스화하는 방법은 중요하지 않습니다. 저는 항상 CreateObject를 사용하여 외부 라이브러리에 대한 개체 참조를 인스턴스화합니다. 이렇게하면 초기 바인딩과 후기 바인딩간에 전환 할 수 있고 개체를 선언하는 줄인 두 줄만 전환하면됩니다.
JimmyPena

6

Herbert Schildt C ++ 책에서 비슷하지만 더 자세한 답변 :-

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

초기 바인딩의 반대는 후기 바인딩입니다. 지연 바인딩은 런타임까지 해결되지 않는 함수 호출을 나타냅니다. 가상 기능은 후기 바인딩을 달성하는 데 사용됩니다. 아시다시피 기본 포인터 또는 참조를 통해 액세스 할 때 실제로 호출되는 가상 함수는 포인터가 가리키는 개체 유형에 따라 결정됩니다. 대부분의 경우 컴파일 타임에 확인할 수 없기 때문에 개체와 함수는 런타임까지 연결되지 않습니다. 후기 바인딩의 주요 이점은 유연성입니다. 초기 바인딩과 달리 후기 바인딩을 사용하면 많은 양의 "우발 코드"를 만들지 않고도 프로그램이 실행되는 동안 발생하는 이벤트에 응답 할 수있는 프로그램을 만들 수 있습니다. 함수 호출은 런타임까지 해결되지 않기 때문에 지연 바인딩으로 인해 실행 시간이 다소 느려질 수 있습니다. 하지만 오늘은


1
"객체와 함수는 런타임까지 연결되지 않습니다."이 문장은 객체가 런타임 이전에 존재 함을 암시하는 것 같습니다. 객체는 순전히 런타임 엔티티가 아닙니까? 컴파일 타임에 존재하는 객체의 클래스입니다. 이것은 더 나은로 언급 될 수있다 "함수 호출과 그 구현은 실행 시간까지 연결되어 있지 않습니다"
programmerravi을

후기 바인딩의 한 예는 인터페이스 나 추상 클래스를 사용하고 런타임에 바인딩하는 다형성 (OOP)입니다.
Mohamad Mirzadeh

3

통역 언어에서는 그 차이가 조금 더 미묘합니다.

루비:

# 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는 후기 바인딩을 많이 사용하여 애플리케이션을 실행하는 데 필요한 구성의 양을 줄입니다.


이 점은 JIT 컴파일 된 구성 요소를 포함하고 플러그인 또는 동적 프레임 워크를 구현하기 위해 런타임에 포함 할 수있는 컴파일 된 언어에도 적용됩니다. 이에 대한 몇 가지 표준 예제는 Java, 물론 Ruby 및 Python에도 존재합니다. 극단적 인 예는 Erlang입니다. 여기서 런타임은 라이브 업그레이드 / 다운 그레이드를 위해 한 번에 두 가지 버전의 모듈을로드 할 수 있습니다. 따라서 많은 Erlang 코드 (대부분?)가 정적으로 형식화 된 순수 함수로 작성되었지만 런타임 요구 사항은 내부적으로 후기 바인딩 및 동적 형식을 요구합니다.
zxq9

0
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의 코드가 컴파일되지 않습니다.


0

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.