바인딩
일반적인 의미에서, 속성과 개체 사이 또는 연산과 기호 사이와 같은 연관(Association) 이다. 바인딩이 일어나는 시간을 바인딩 시간이라고 부른다. 바인딩과 바인딩 시간은 프로그래밍 언어 의미론에서 매우 중요한 개념이다. 바인딩은 언어 설계 시간, 언어 구현시간, 컴파일 시간, 링크 시간, 적재 시간, 또는 실행 시간에 일어날 수 있다.
이름을 속성에 연관(bind)시키는 과정이 바인딩이다.
아래의 C 코드를 보자
int count;
count = count + 5;
위 코드에 대해 고려할 수 있는 바인딩과 바인딩 시간은 다음과 같다.
- count에 대한 가능한 타입은 언어 설계 시간에 바인딩 된다
ex) int, long, float 등등
- count의 타입은 컴팡리 시간에 바인딩 된다.
ex) int에 대응
- count의 가능한 값들의 집합은 컴파일러 설계 시간에 바인딩 된다.
ex) int형 값의 범위 (? ~ ?)
- 연산자 기호 +에 대한 가능한 의미의 집합은 언어 구현 시간에 바인딩된다.
ex) 수치 연산과 문자열 결합
- 연산자 기호 +의 의미는 컴팡리 시간에 피연산자의 타입이 결정되었을 때 바인딩 된다.
ex) 피연산자인 count와 5는 int형 이므로 수치 연산으로 바인딩
- 리터럴 5의 내부 표현은 컴파일러 설계 시간에 바인딩 된다.
ex) 바이트 코드로 00001001로 표현
- count의 값은 이 코드의 실행 시간에 바인딩 된다.
ex) count가 가리키는 메모리 공간에 5를 저장.
바인딩 타입이란?
바인딩은 프로그램의 각종 변수값들이 실제 값으로 묶여 버리는 것으로, 개념적으로는 설계, 코딩, 컴파일, 실행, 번역, 언어의 구현, 정의 등 프로그래밍 전 과정에 일어난다. 일반적으로는 컴파일 시간에 일어나는 정적 바인딩과, 실행 시간에 일어나는 동적 바인딩을 의미한다. 따라서 바인딩 타임이란 프로그램에서 변수들이 갖는 속성이나 값이 완전히 결정되는 시간을 말하며, 이름에 속성이 연결되는 시간을 뜻한다.
바인딩 타임의 종류
- 바인딩이 일어나는 시기 또는 결정되는 시간을 말한다.
1) 언어 설계 시간
- 언어에서 허용되는 대부분의 자료구조나 프로그램 구조 등을 확정
ex) 혼합형 연산 허용 시 어떤 연산을 수행할 것인가 등을 확정
2) 언어 구현 시간
- 언어 정의 시 원소에 대한 특성을 모두 한정치 않고 구현 시 일부 확정토록 일임, 대부분 언어들이 구현 시 바인딩을 최소화하여 특정기종에 구애받지 않도록 함.
ex) 정수의 자리 수, 실수의 유효숫자 개수 등
3) 컴파일 시간
- 정적바인딩. 변수의 이름 또는 형과 프로그램 문장 구조 등 확정. 효율성 중시.
4) 링크 시간
- 부 프로그램 코드로 라이브러리에서 부 프로그램을 호출
5) 적재 시간
- 변수를 메모리 셀로 바인드 함.
6) 실행 시간
- 실행 시간에 일어나는 바인딩. 변수에 값을 확정하거나 변수에 기억장소 할당.
정적바인딩 : 실행 시간(run time)전에 일어나고, 실행 중에 변하지 않는 상태로 유지되는 바인딩.
ex) int a; //integer 타입을 이름 'a'에 정적으로 방니딩.
동적바인딩 : 실행 시간(run time) 중에 일어나거나 프로그램 실행 과정에서 변경되는 바인딩. (즉 정적 시간대에 바인딩되어있어도.. 실행하다가 바뀐다면 동적 바인딩이다.)
ex) ptr = new int; // 할당한 기억 장소를 y에 동적으로 바인딩.
(실행 중 어떻게 정해질지 모르므로..)
할당
기억 장소 할당 : 변수에 메모리 공간을 바인딩하는 과정
생명 주기, 수명 : 변수의 수명은 메모리 공간에 바인딩 될 때 시작되여 회수 될 때 끝난다.
정적할당
- 변수에 메모리 공간이 정적으로 할당되는것, 한번 할당되면 프로그램이 종료될 때까지 할당 상태가 유지된다.
스택 기반 할당
- 자동 할당(Automatic Allocation)이라고도 함, 변수의 타입은 정적으로 할당되지만, 메모리 공간을 실행 중에 할당. 스택 기반 할당이 이루어지는 메모리 공간은 스택
동적 할당
- 명시적인 명령어에 의해 실행되는 할당, 동적할당이 이뤄지는 메모리 공간은 힙(heap), 동적으로 할당된 영역은 포인터나 참조변수를 통해서 참조가능.
[참고]