Binding이란 attribute와 entity의 결합을 말한다. 예를 들면 변수와 type이나 value가 결합되는 것이나 연산자와 기호가 결합되는 것이 있다. 이때 Binding이 언제 이루어지냐에 따라 compile binding, run time binding으로 나눌 수 있다.

compile binding은 static binding이라고도 부르며 프로그램을 컴파일 하는 과정에서 binding이 이루어지고 프로그램이 실행하는 동안 바뀌지 않는 것을 말하고 run time bindng 은 dynamic binding이라고도 부르며 프로그램이 실행되고 있는 runtime에 binding이 이루어지고 프래그램이 실행되는 동안 변할 수 있는 것을 말한다. static binding을 하는 언어들은 C기반 언어 등이 있고 dynamic binding을 하는 언어로는 python, ruby, javascript, php등이 있다.

 

    변수는 프로그램에서 언급되기 전에 data type에 bind되어야 한다. Type binding은 다음 두 가지에 의해 결정된다.

1. 어떻게 type이 명시되어 있는 지

2. 언제 binding이 이루어지는지

    static binding에선 변수의 type을 선언한다. 선언된 type은 프로그램이 끝날 때까지 변하지 않는다. C언어의 다음 예시를 생각해보자.

#include <stdio.h>

int main() {
    int a;
    a = 10;
    //a = "hello";
    printf("%d", a);
    
    return 0;
}

우리는 변수 a를 정수형으로 사용하기 위해서는 위와 같이 a를 integer형으로 선언해야한다. 만약 int형으로 선언한 a에 주석처리를 한 것과 같이 문자열을 넣는다면 컴파일 에러가 날 것이다. integer형으로 선언한 a는 프로그램이 끝날 때까지 int형으로만 사용할 수 있다.

    dynamic binding에서는 변수의 type을 선언하지 않는다. 이런 변수는 어떤한 type의 값도 설정할 수 있다. 변수의 type은 변수에 값을 넣는 assignment statement(배정문)에서 결정되고 bind된다. 다음 python 코드를 보자

b = 10
#b = hello
print(b)

python에서는 변수의 type을 선언하지 않는다 b = 10라는 줄이 실행될 경우 b는 integer형으로 자동적으로 binding된다. 만약 배정문이 b = hello일 경우 b는 str형으로 자동적으로 binding된다. 

 

그렇다면 프로그래머 입장에서는 dynamic type binding이 더 편리한 것 아닐까? 굳이 변수를 타입에 맞춰서 선언할 필요도 없고 편리하다고 생각이 든다. 하지만 dynamic type binding의 가장 큰 단점은 비용이 크다는 것이다. 프로그램이 실행되는 run time에 binding되므로 실행 시간이 static type binding에 비해 길다. 그렇기 때문에 dynamic type binding은 대부분 compiler 방식이 아니라 interpreter 방식을 사용한다. 또한 static type binding의 compiler에 비해 error checking 능력이 떨어진다. 자유로운 형 변환이 가능하기 때문에 integer형 변수였던 i에 double형 값을 중간에 넣고 이를 까먹었을 경우 프로그래머가 원하는 결과가 나오지 않을 수 있다. interpreter는 int형 변수에 double형을 넣은 줄을 보고 에러를 발생시키지 않기 때문에 프로그래머가 이러한 오류를 직접 찾아야한다. 굉장히 큰 프로그램일 경우 이 오류를 찾는 것은 너무 힘든 일일 것이다. 이렇게 dynamic binding은 어떠한 type으로도 쉽게 바꾸고 사용할 수 있는 편리하다는 장점이 있지만 오류가 발생하였을 때 오류를 찾는데 어려움이 있고 실행 시간이 오래걸린다는 단점도 존재한다. 이렇게 장단점이 다르기 때문에 어떤 목적으로 프로그램을 사용할 것인가에 따라 언어를 선택하는 것도 굉장히 중요하다.

+ Recent posts