네임 바인딩

프로그래밍 언어에서 네임 바인딩 (name binding)은 엔티티들(데이터 그리고/또는 코드)과 식별자들의 연관이다.Microsoft (May 11, 2007), Using early binding and late binding in Automation, Microsoft, retrieved May 11, 2009 객체에 바운드되는 식별자는 객체를 참조한다고 불린다. 기계어는 식별자의 빌트인 개념을 갖진 않지만, 서비스로서 그리고 프로그래머를 위한 표기로서 네임-객체 바인딩을 가지며 이것은 프로그래밍 언어들에 의해서 구현된다. 바인딩은 스코핑(변수 영역)과 밀접하게 연결되는데, 스코핑은 어떤 네임들을 어떤 객체들에 바인드할 지를 결정한다 - 프로그램 코드의 어느 위치에서 그리고 가능한 실행 경로들 중 어느 곳에서.

id를 위한 바인딩을 확립하는 문맥에서 식별자 id의 사용은 바인딩 발생이라고 불린다. 모든 다른 발생들(예를 들면 포현식들, 할당들 그리고 서브프로그램 호출들에서)에서 식별자는 무엇이 바운드되었는지를 나타낸다; 이러한 발생들은 적용된 발생이라고 불린다.

 바인딩 시간 
프로그램이 실행되기 이전에 이름의 바인딩은 static (또한 "이른")이라고 불린다; 프로그램이 실행할 때 수행되는 바인딩들은 동적(또한 "늦은" 또는 "가상")이라고 불린다.

정적 바인딩의 예시는 직접적인 C 함수 호출이다: 식별자에 의해 참조되는 함수는 런타임 시에 변경되지 못한다.

그러나 동적 바인딩의 예시는 동적 디스패치이며, C++ 가상 메소드 호출이 그것이다. 다형적인 객체의 구체적인 타입이 런타임 전에는 알려지지 않기 때문에, 실행된 함수는 동적으로 바운드된다. 예를 들면 다음의 자바 코드를 보자: public void foo(java.util.List<String> list) {
     list.add("bar");
 }
 List는 인터페이스여서, list는 반드시 이것의 서브타입을 가리켜야 한다. 이것이  LinkedList,  ArrayList, 또는  List의 다른 서브타입을 참조하는가?  add에 의해 참조되는 실제 메소드는 런타임 전까지는 알려지지 않는다. C 같은 언어에서 실제 함수는 알려진다.

 리바인딩과 변형 
리바인딩은 반드시 변형(mutation)과 헷갈려서는 안된다 – "리바인딩"은 참조하는 식별자에 대한 변화이다; "변형"은 참조되는 값의 변화이다. 다음의 자바 코드를 보자: LinkedList<String> list;
 list = new LinkedList<String>();
 list.add("foo");
 list = null;
 식별자 list는 초기에 아무것도 참조하지 않는다(초기화되지 않았다); 그 후 이것은 객체를 참조하기 위해 리바운드된다(문자열들의 링크드 리스트). list에 의해 참조되는 링크드 리스트는 리스트에 문자열을 추가하면서, 그 후 변형된다. 마지막으로 list는  null에 리바운드된다.

 늦은 정적 바인딩 
늦은 정적 바인딩은 정적과 동적 바인딩의 중간 어느쯤이다. 다음의 PHP 예시를 보자:class A {
    static $word = "hello";
    static function hello() {print self::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();이 예시에서, PHP 인터프리터는 함수 hello()를 클래스 A에 바인드하며, 그래서 B::hello()에 대한 호출은 문자열 "hello"를 만들어 낸다. 만약 self::$word 의 의미가 늦은 정적 바인딩에 기초한다면, 결과는 "bye"였을 것이다.

PHP 버전 5.3을 시작으로, 늦은 정적 바인딩이 지원된다."Late Static Bindings" 구체적으로, 만약 위의 self::$word가 다음에 나오는 블록처럼 static::$word로 바뀌었다면,  B::hello()에 대한 호출의 결과는 "bye"일 것이다:class A {
    static $word = "hello";
    static function hello() {print static::$word;}
}

class B extends A {
    static $word = "bye";
}

B::hello();

 같이 보기 
 늦은 바인딩
 분기 테이블 또는 함수 포인터를 통해 네임 바인딩을 적용하는 분기 테이블 메소드
 동적 디스패치

 각주 

분류:프로그래밍 언어 개념