프로그래밍을 하다 보면 바인딩이라는 용어를 접하게 됩니다. 사전적인 의미로는 협약, 합의 등이 되는데, 프로그래밍에서는 어떤 구성요소의 성격이나 값을 확정하는 것이라고 해석합니다. 주로 변수의 자료형, 호출되는 함수의 이름의 타입이 결정되는 과정으로 해석할 수 있습니다.
정적바인딩(static binding)의 경우 자료형이 있는 컴파일 언어(C, Java 등)가 컴파일 되어 기계어로 처리 되기 전에 이루어지는 과정입니다. 즉, 어떤 변수의 자료형과 함수이름등이 이미 존재 하여야 하고 이러한 변수, 함수의 정적 바인딩이 문제 없이 처리되면 declaration error 같은 컴파일 오류가 없이 컴파일이 되고, 실행 파일이 생성됩니다.
동적바인딩(dynamic binding)은 컴파일 타임이 아닌 런타임(실행중에)때 자료형이 결정되는 언어 즉, 인터프리터언어(에서 주로 처리되는 방법입니다. 인터프리터 언어(JavaScript, Python)의 경우는 언어에서 제공되는 변수에 대한 자료형이 따로 없고 대입되는 값에 따라 런타임에 바인딩이 이루어집니다. 따라서 따로 컴파일이라는 과정이 없으므로 실행과정 중에 문법적인 오류가 발생할 수 있습니다.
컴파일언어에도동적으로클래스나함수를사용하는방법이제공됩니다. 자바나 C언어로 프로그래밍을 할때도 컴파일 시가 아닌 실행 중에 필요한 라이브러리나 클래스를 로드하여 사용해야 하는 경우가 있습니다. 소프트웨어를 개발하다보면 개발 시점이 아닌 실행 시점에 어떤 상황이나 조건에 따라 사용해야 하는 클래스나 함수가 결정될 수 있습니다. database의 종류에 따라 JDBC라이브러리를 결정 한다던가, 여러 함수 중에 조건에 따라 호출될 수도 있고, 안될 수도 있는 함수가 있는 라이브러리가 있다면 이런 경우는 동적로딩방식을 사용할 수 있습니다.
자바에서는 Class.ForName(String) 메서드를 이용하여 런타임시에 필요한 클래스를 동적으로 로딩하여 사용할 수 있습니다. 이때 해당하는 클래스가 local이나 지정된 네트워크상에 없는 경우 ClassNotFoundException 이 발생하고 이 예외에 대한 처리가 필요합니다.
C 언어는 외부 라이브러리에서 제공되는 함수를 컴파일 타임에 링크하여 처리해야 하지만, LoadLibaray(char*) 함수를 활용하면 동적으로 필요한 DLL을 런타임에 로딩하고 이에 포함되어 있는 함수를 함수 포인터를 이용하여 호출하여 사용할 수 있습니다. 이 역시 local에 해당 DLL이 존재하지 않는다라면 에러가 발생하고 실행이 중단될 수 있습니다.
