네임 바인딩

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

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을 시작으로, 늦은 정적 바인딩이 지원된다. 구체적으로, 만약 위의 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();

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

각주 

프로그래밍 언어 개념