변수 (Variable)
변수(Variable)란 데이터를 저장하거나 나중에 사용할 수 있도록 메모리를 추상화한 것이다. 변수는 네 가지의 중요한 속성을 가지는데 네 가지 속성은 다음과 같다.
- 변수명: 변수를 대표하는 이름이다, 식별자에 해당한다.
- 타입: 변수에 저장할 수 있는 데이터 집합의 종류이다.
- 주소: 변수가 사용하는 메모리의 위치이며, "참조(Reference)"라고도 한다.
- 값: 변수에 저장된 데이터이다. 변수의 값은 수행시간 동안 변경될 수 있다.
이때, 프로그램 수행 중 변수가 사용되기 위해서는 각 속성이 구체적으로 결정되어야 한다.
바인딩(Binding)
바인딩(Binding)은 언어 구성 요소의 속성이 구체적으로 결정되는 것이다. 언어 구성 요소의 속성이 결정되는 시점은 언어의 구성요소나 속성에 따라 다르며, 이를 바인딩 시각(Binding Time)이라고 한다. 바인딩 시각은 다음으로 구분 가능하다.
- 언어의 정의 시점: 연산자의 의미, 수의 의미 등이 바인딩된다.
- 언어의 구현 시점: 타입의 자릿수, 수의 표기법 등이 바인딩된다.
- 컴파일 시점: 변수의 타입 등이 바인딩된다.
- 링크 시점: 라이브러리 함수의 내용 등이 바인딩된다.
- 로드 시점: 변수의 주소 등이 바인딩된다.
- 프로그램 수행 시점: 변수의 값 등이 바인딩된다.
바인딩은 크게 정적 바인딩과 동적 바인딩으로 구분된다.
- 정적 바인딩(Static Binding): 프로그램 수행 시점에 바인딩의 변화가 없는 경우이며, 언어의 정의 시점부터 로드 시점까지인 경우를 정적 바인딩이라고 한다.
- 동적 바인딩(Dynamic Binding): 프로그램 수행 시점에 바인딩되거나 바인딩이 해지되는 경우이며, 프로그램을 수행하며 상황에 맞게 바인딩할 수 있기에 유연한 프로그래밍이 가능하다.
변수의 바인딩
특별히 변수의 바인딩은 변수의 속성이 구체적으로 결정되는 것을 말한다. 변수의 속성으로는 변수명, 타입, 주소, 값이 있으며 프로그램 수행 중에 변수가 사용되기 위해서는 이 속성들이 바인딩되어야 한다. 변수의 속성은 변수명 -> 타입 -> 주소 -> 값 순서로 바인딩된다.
변수명 바인딩
변수의 이름을 바인딩하는 방법으로는 명시적 선언(Explicit Declaration)과 묵시적 선언(Implicit Declaration)이 있다.
- 명시적 선언(Explicit Declaration): 선언문을 이용하여, 선언문에 명시된 이름으로 변수명을 바인딩한다.
- 묵시적 선언(Implicit Declaration): 선언문을 이용하지 않고, 처음 사용된 이름으로 변수명을 바인딩한다.
타입 바인딩
변수의 타입을 바인딩하는 방법으로도 명시적 선언(Explicit Declaration)과 묵시적 선언(Implicit Declaration)이 있다.
- 명시적 선언(Explicit Declaration): 변수의 타입을 선언문에 명시된 타입으로 바인딩한다.
- 묵시적 선언(Implicit Declaration): 변수명이나 대입할 값으로부터 정해지는 타입으로 변수의 타입을 바인딩한다.
타입 바인딩 시각은 정적 타입 바인딩과 동적 타입 바인딩으로 구분 가능하다.
- 정적 타입 바인딩: 컴파일 시점에 구문 분석을 통해 타입을 판별할 수 있다. 명시적 선언, 묵시적 선언 모두 가능하다
- 동적 타입 바인딩: 변수의 타입을 고정하지 않고, 대입할 값에 맞추어 계속 변화시킨다.
주소 바인딩
주소 바인딩이란 변수가 사용할 메모리가 할당되어 변수의 주소가 그 메모리의 주소로 바인딩되는 것이다. 이때, 가용한 메모리 중 필요한 만큼 공간을 변수에 배정하는 것을 "할당(Allocation)"이라고 하고, 할당된 메모리가 필요하지 않아 변수로부터 회수하는 것을 "해제(Deallocation)"이라고 한다. 변수에 메모리가 할당되고 해제되는 동안 변수의 주소가 바인딩되며, 이때 변수가 메모리를 할당받는 기간을 "변수의 수명(Lifetime, Extent)"라고 한다.
변수의 주소를 바인딩하는 방법으로는 자동 할당과 수동 할당이 있다.
- 자동 할당: 명시적 선언/묵시적 선언을 통해 정해진 변수의 타입에 맞게 필요한 메모리를 할당하는 방법이다. (Ex. int형 변수를 선언하면 자동으로 4바이트의 메모리가 할당되는 것)
- 수동 할당: 프로그래머가 지정한 크기만큼 메모리를 할당하는 방법이다. (Ex. malloc 함수를 통해 동적으로 메모리를 할당하는 것)
주소 바인딩 시각은 정적 주소 바인딩과 동적 주소 바인딩으로 구분 가능하다.
- 정적 주소 바인딩: 로드 시점에 정적 세그먼트의 주소를 바인딩하여 프로그램의 수행이 끝날 때까지 바인딩을 유지한다. 이때, 정적 바인딩을 하는 변수를 정적 변수(Static Variable)라고 한다. 정적 변수의 수명은 프로그램 수행 전체가 된다.
- 동적 주소 바인딩: 프로그램 수행 중 변수가 사용되는 시점에 동적 세그먼트의 주소를 바인딩한다. 이때, 동적 바인딩을 하는 변수를 동적 변수(Dynamic Variable)라고 한다. 동적 변수는 동적 세그먼트의 사용 영역에 따라 동적 세그먼트 중 스택에서 메모리를 할당받는 스택 동적 변수(Stack Dynamic Variable)와 동적 세그먼트 중 힙에서 메모리를 할당받는 힙 동적 변수(Heap Dynamic Variable)로 나뉜다.
값 바인딩
변수의 값은 프로그램 수행 중 계속해서 바뀔 수 있기에 값 바인딩은 여러 번 일어날 수 있다.