아메리카노가 그렇게 맛있답니다 여러분

 

동적 바인딩은 Run-time Binding, 또는 Late Binding이라 하고 정적 바인딩은 Compile-time Binding, 또는 Early Binding이라고도 합니다.

(Compile-time은 컴파일할 때를 의미하고 Run-time은 프로그램이 실행될 때를 의미합니다.)

 

하지만 여러분들은 동적 바인딩이란 단어로 알고 동적 바인딩을 검색해서 들어오셨을 것이라 생각되기 때문에 단어 제시는 하되 본문에서는 동적 바인딩이란 말을 사용하여 설명하겠습니다.

 

 

개념적인 부분에서 살펴보면,

 

[위 그림은 C를 기준으로 하였으며 자바의 경우 (.c)->(.obj)->(.exe)가 아닌 (.c)->(.exe)로 생각하면 됩니다.]

 

 

정적 바인딩컴파일러 시간에 변수의 크기를 정할 수 있는 것을 의미합니다.

쉽게 이해할 수 있는 예로 C언어에서 동적 할당을 쓰지 않고 소스를 만들어내면 그 소스는 정적 바인딩만 사용하여 만든 코드입니다.

(더 짧게 말하면 char, short, int, float, double 변수가 정적 바인딩된 변수입니다.)

 

동적 바인딩이란 프로그램이 실행되어야 메모리에 크기가 얼마만큼 할당되는지 알 수 있게 되는 것을 의미합니다.

C의 경우 malloc(), calloc()을 이용하여 동적할당을 하면 프로그램이 돌아간 후에야 얼마만큼 메모리를 할당해야 하는지 알 수 있기 때문에 동적 바인딩이라 볼 수 있습니다.

자바의 경우 모든 new를 사용하여 만들어진 객체는 동적 바인딩된 것이라 할 수 있습니다.

 

 

 

개념적인 부분에서 간단히 요약하여 어떤 것이 정적 바인딩된 것이고 어떤 것이 동적 바인딩된 것인지에 대해 설명했습니다.

정적 바인딩에 대해서는 쉽게 동감할 수 있을 것이라 생각합니다. 하지만 동적 바인딩에서 '왜 자바는 모든 객체가 동적 바인딩인가'에 대해 의문을 가지실 수 있을 것이라 생각됩니다.

자바의 클래스는 int나 float과 달리 코드 영역에 존재합니다. 그림을 그리자니 설명이 연속적으로 보이지 않을 수 있으므로 넣진 않겠습니다만, printf()같은 함수처럼 클래스에 어떤 필드가 쓰이고 메소드를 갖는 것에 대한 코드가 모두 코드영역에 존재합니다. 그렇기 떄문에 클래스를 이용한 객체를 만드려면 코드 영역을 참조해야 하고, 이 말은 Runtime 단계 때 참조가 일어나므로 동적 바인딩이란 의미입니다.

더 간단한 말로 설명하자면 String클래스를 모범 예제로 생각하시면 됩니다. String클래스는 문자열을 저장하는 클래스인데 문자열의 길이는 "Hello"라고 쓸 때와 "Hi"라고 쓸 때 서로 다릅니다. 즉, 가변적이죠. Scanner클래스를 이용해서 nextLine()메소드로 입력받은 한 줄을 저장할 경우 역시 가변적이고요. 그렇기 때문에 Runtime 단계에서 크기를 정해야 합니다.

String클래스의 크기가 가변적일 수 있다는 뜻은 다른 클래스들도 가변적일 수 있다는 뜻이고, 이는 비록 내가 만든 클래스는 크기가 고정되어 있더라도 크기가 가변적일 수 있는 다른 클래스들 때문에 프로그램 실행 단계에서 크기를 설정해야 합니다. (컴파일러가 선택적으로 클래스를 구분할 수는 없으니까요.)

 

 

한 가지 재미난 공통점을 말씀드리자면 힙(heap) 영역에 저장되는 대부분의 것들은 동적 바인딩이라 볼 수 있습니다.

C의 malloc(), 자바와 C#의 Object 모두 힙에 저장된다는 점에서 힙에 들어가는 대부분은 동적 바인딩이라 할 수 있습니다.

(다만 이는 일반화하여 본 경우이므로 힙에 들어간다 = 동적 바인딩이라는 공식은 성립되지 않습니다.)

 

또한 C#에서는 모든 객체가 동적 바인딩은 아니라는 점 역시 재미난 것 중 하나입니다.

C#에서는 int 역시 하나의 객체로 존재합니다. (그래서 .toString이 되는 것이죠.)

하지만 이것이 동적 바인딩을 의미하는 것은 아닙니다. C#에서의 동적 바인딩을 궁금해하셨다면 이 점을 참고하시면 좋겠습니다. 

 

마지막으로, 동적 바인딩과 정적 바인딩이라는 개념이 생긴 시기가 언제인지 알 필요가 있습니다.

동적 바인딩과 정적 바인딩은 객체지향 언어가 나오기 전에 만들어진 말들입니다. 객체지향언어보다는 절차지향언어와 역사를 같이 한 단어죠. 만약에 생물학적인 분류가 크게 발전하지 않은 때에 '모든 물에 사는 것들은 어류이다'라고 정의했다면, 우리는 돌고래를 어류라고 봐야할까요 포유류라고 봐야할까요?

물론 포유류로 봐야하는 것이 맞긴 하지만 하고 싶은 말은 동적 바인딩인가 정적 바인딩인가가 중요한 것이 아니란 뜻입니다. 이는 이론적인 부분에서는 의미가 있지만 실상에서는 큰 의미를 갖지 않기 때문입니다. 그러므로 '이런 것이 있는데 분류를 굳이 하자면 이렇더라' 정도로 생각해주시면 됩니다.