프로그래밍언어론 7강 - 변수와 바인딩의 원리
메모리를 추상화한 변수의 개념과 변수명·타입·주소·값·수명·영역이라는 속성을 살펴본다. 바인딩 시각과 정적·동적 바인딩의 차이를 이해하고, 변수명·타입·주소가 결정되는 과정과 정적 변수·스택 동적 변수·힙 동적 변수의 특징을 체계적으로 정리한다.
제1장 변수의 개념과 속성
1. 메모리의 추상화로서 변수
변수(variable)는 프로그램에서 처리할 데이터를 저장하고 관리할 수 있도록 컴퓨터 하드웨어의 메모리를 추상화한 것이다. 물리적인 메모리는 주소가 붙은 저장 공간이지만, 프로그래머가 매번 실제 주소를 기억해 사용하는 것은 불편하다. 변수는 특정 메모리 공간에 상대적인 이름을 붙여 그곳의 데이터를 쉽게 읽고 변경하게 한다.
예를 들어 int x12;는 정수를 저장할 변수 x12를 준비하고, x12 = 1 + 5 * 2;는 계산 결과 11을 그 변수의 메모리 공간에 저장한다. 이후 if x12 > 10은 실제 메모리 주소를 직접 쓰지 않고 변수명으로 저장된 값을 참조한다. 따라서 변수는 단순한 값이 아니라 이름, 데이터 종류, 저장 위치 등이 결합된 추상적 대상이다.
핵심 정의: 변수는 데이터를 저장하는 메모리 공간에 대한 상대적인 이름이며, 프로그램이 하드웨어 주소 대신 의미 있는 이름으로 데이터를 다루게 하는 메모리 추상화이다.
2. 변수의 여섯 속성
변수를 정확히 이해하려면 변수명, 타입, 주소, 값, 수명, 영역의 여섯 속성을 구분해야 한다. 이 속성들은 서로 관련되지만 같은 대상을 가리키지 않는다. 특히 주소는 저장 위치, 값은 그 위치에 저장된 데이터이며, 수명은 메모리를 점유하는 기간, 영역은 프로그램 문장에서 그 이름을 사용할 수 있는 범위이다.
| 속성 | 의미 | 확인 질문 |
|---|---|---|
| 변수명(name) | 변수의 이름이며 식별자(identifier) | 프로그램에서 무엇이라 부르는가? |
| 타입(type) | 저장할 수 있는 데이터 집합의 종류인 자료형 | 어떤 종류의 데이터를 저장하는가? |
| 주소(address) | 변수가 사용하는 메모리의 위치이며 참조(reference) | 어디에 저장되어 있는가? |
| 값(value) | 변수의 메모리 공간에 저장된 데이터 | 현재 어떤 데이터가 들어 있는가? |
| 수명(lifetime, extent) | 변수가 메모리를 할당받고 있는 기간 | 언제부터 언제까지 저장 공간을 갖는가? |
| 영역(scope) | 프로그램에서 변수명을 사용할 수 있는 범위 | 코드의 어느 부분에서 그 이름이 보이는가? |
값은 수행 시간 동안 여러 번 바뀔 수 있다. 반면 변수명이나 타입, 주소가 언제 어떻게 바뀌는지는 언어와 선언 방식, 메모리 할당 방식에 따라 달라진다. 이러한 속성이 구체적으로 결정되는 현상을 바인딩이라고 한다.
3. 배런의 변수 표기법
배런(Barron)의 변수 표기법은 변수의 주요 속성과 관계를 그림처럼 연결해 나타낸다. 변수명은 타입과 연결되고, 타입은 값이 들어 있는 저장 공간과 연결된다. 값이 들어 있는 저장 공간에는 주소가 붙는다. x12의 타입이 int, 주소가 FF00, 값이 11이라면 이 네 정보를 하나의 관계 구조로 읽을 수 있다.
이 표기법에서 변수명은 메모리 주소 그 자체가 아니다. 이름을 통해 타입과 저장 공간을 참조하는 관계가 형성될 뿐이다. 포인터를 사용해 이름 없는 동적 메모리 공간을 다루는 경우에는 일반 변수명 위치가 비어 있을 수 있으며, 포인터 값이 그 공간의 주소를 간접적으로 가리킨다.
int *p = new int; *p = 11;에서는 새로 할당된 정수 저장 공간에 일반적인 변수명이 직접 붙지 않는다. 포인터 p가 그 공간의 주소를 갖고, *p를 통해 값을 읽고 쓴다.
제2장 바인딩과 바인딩 시각
1. 바인딩의 의미
바인딩(binding)은 언어 구성 요소의 속성이 구체적으로 결정되는 것이다. 같은 프로그램에서도 여러 종류의 바인딩이 일어난다. int가 4바이트 정수형으로 정해지는 것, 변수명이 x12로 정해지는 것, =가 대입 연산자로 정해지는 것, +와 *의 연산 의미가 정해지는 것, 변수의 값이 11로 정해지는 것이 모두 바인딩의 예이다.
2. 바인딩 시각
바인딩 시각(binding time)은 바인딩이 일어나는 시점이다. 언어 정의, 언어 구현, 컴파일, 링크, 로드, 프로그램 수행의 여러 시점이 있으며, 어떤 속성이 어느 시점에 결정되는지는 속성의 종류와 언어 구현 방식에 따라 달라진다.
| 바인딩 시각 | 대표적인 바인딩 예 |
|---|---|
| 언어 정의 시점 | 연산자의 의미, 수의 의미 |
| 언어 구현 시점 | 타입의 자릿수, 수의 표기법 |
| 컴파일 시점 | 변수의 타입 |
| 링크 시점 | 라이브러리 함수의 내용 |
| 로드 시점 | 정적으로 배치되는 변수의 주소 |
| 프로그램 수행 시점 | 변수의 값, 동적으로 정해지는 속성 |
예를 들어 +가 덧셈 연산자라는 사실은 언어 정의 시점에 결정되고, int가 몇 바이트인지와 같은 구체적인 표현은 언어 구현 시점에 결정될 수 있다. 선언된 변수의 타입은 보통 컴파일 과정에서 판단되며, 변수에 실제로 대입되는 값은 프로그램 수행 중 계속 바뀔 수 있다.
3. 정적 바인딩과 동적 바인딩
여러 바인딩 시각은 프로그램 수행 중 변화 여부를 기준으로 정적 바인딩과 동적 바인딩으로 단순화할 수 있다. 정적 바인딩(static binding)은 프로그램 수행 시점에 바인딩이 변하지 않는 경우이다. 언어 정의, 언어 구현, 컴파일, 링크, 로드 시점의 바인딩을 포함하며 수행 시간의 효율성이 높아 컴파일 방식에 적합하다.
동적 바인딩(dynamic binding)은 프로그램 수행 시점에 바인딩되거나 기존 바인딩이 해지되는 경우이다. 실제 바인딩 시각이 프로그램 수행 시점인 경우만 해당하며, 실행 상황에 맞게 속성을 바꿀 수 있어 유연한 프로그래밍이 가능하고 인터프리터 방식에 적합하다.
| 구분 | 정적 바인딩 | 동적 바인딩 |
|---|---|---|
| 결정과 변화 | 수행 전에 결정되어 수행 중 변화하지 않음 | 수행 중 바인딩 또는 해지가 일어남 |
| 장점 | 수행 시간 효율성이 높음 | 프로그래밍 유연성이 높음 |
| 적합한 방식 | 컴파일 방법 | 인터프리터 방법 |
판단 기준: ‘정적’과 ‘동적’은 단순히 선언문이 있는지로 구분하지 않는다. 프로그램 수행 시점에 해당 바인딩이 새로 생기거나 해지되는지를 기준으로 구분한다.
제3장 변수명과 타입의 바인딩
1. 변수 속성의 일반적인 바인딩 순서
변수가 프로그램 수행 중 사용되려면 그 속성이 구체적으로 결정되어야 한다. 일반적인 순서는 변수명 바인딩, 타입 바인딩, 주소 바인딩, 값 바인딩이다. 값은 대입이 수행될 때마다 여러 번 바인딩될 수 있다. 이 순서는 이름이 정해지고, 저장할 데이터 종류가 정해지며, 그에 맞는 저장 공간이 정해진 다음 실제 데이터가 저장된다는 흐름을 보여 준다.
2. 변수명 바인딩: 명시적 선언과 묵시적 선언
명시적 선언(explicit declaration)은 선언문에 적힌 이름으로 변수명을 바인딩하는 방법이다. int x12;처럼 변수 사용 전에 별도의 선언을 작성한다. 묵시적 선언(implicit declaration)은 별도의 선언문 없이 대입문 등에서 이름이 처음 사용될 때 그 이름을 변수명으로 바인딩한다. k = 123;이 처음 등장하면서 k라는 변수가 만들어지는 방식이 예이다.
명시적·묵시적이라는 구분은 변수명을 어떻게 처음 정하느냐의 차이이다. 묵시적 선언이라고 해서 타입이 반드시 동적으로만 바뀌는 것은 아니며, 타입 바인딩은 다시 별도의 규칙에 따라 판단해야 한다.
3. 타입 바인딩의 방법
타입도 명시적 또는 묵시적으로 바인딩할 수 있다. 명시적 선언에서는 int x12;처럼 선언문에 적힌 타입이 변수의 타입으로 결정된다. 묵시적 선언에서는 변수명이나 대입할 값으로부터 타입이 정해진다.
Fortran에서는 변수명이 i부터 n 사이의 문자로 시작하면 정수형으로 바인딩되는 규칙이 예로 제시된다. Python에서는 대입되는 값으로부터 타입이 정해진다. 예를 들어 k = 123이면 정수형, 이후 k = 'abc'이면 문자열형으로 타입이 바뀔 수 있다.
4. 타입의 정적 바인딩과 동적 바인딩
타입의 정적 바인딩은 컴파일 시점의 구문 분석 등을 통해 타입을 판단하고 수행 중 고정하는 방식이다. 반면 타입의 동적 바인딩은 변수의 타입을 고정하지 않고 대입할 값에 맞추어 계속 변화시키는 방식이다. APL, SNOBOL 4, Python 등이 동적 타입 바인딩 언어의 예이다.
타입의 정적·동적 바인딩과 명시적·묵시적 선언은 서로 다른 분류 축이다. 명시적 선언과 묵시적 선언 모두 언어 설계에 따라 정적 또는 동적 타입 바인딩과 결합할 수 있다. 시험에서는 선언 방식과 바인딩 시각을 혼동하지 않는 것이 중요하다.
구분 예: “타입 이름을 코드에 직접 적었는가?”는 명시적·묵시적 선언의 문제이고, “실행 중 변수의 타입이 대입값에 따라 달라지는가?”는 정적·동적 타입 바인딩의 문제이다.
제4장 주소 바인딩과 변수의 수명
1. 할당, 해제, 수명
주소 바인딩은 변수가 사용할 메모리가 할당되고, 변수의 주소가 그 메모리 주소로 결정되는 것이다. 할당(allocation)은 가용한 메모리 가운데 필요한 만큼의 공간을 변수에 배정하는 것이고, 해제(deallocation)는 할당된 메모리를 변수로부터 회수해 다시 가용 메모리로 돌려주는 것이다.
변수의 수명(lifetime 또는 extent)은 변수가 메모리를 할당받고 있는 기간이며, 같은 말로 변수의 주소가 바인딩된 기간이다. 변수명을 사용할 수 있는 코드 범위인 영역과는 다르다. 수명은 저장 공간의 시간적 존속을, 영역은 이름의 가시 범위를 설명한다.
2. 자동 할당과 수동 할당
자동 할당은 명시적 또는 묵시적 선언으로 정해진 변수의 타입에 맞추어 필요한 메모리를 시스템이 할당하는 방법이다. int x;, double y;처럼 선언된 변수의 크기는 타입에 따라 정해진다. 자동 할당은 상황과 언어에 따라 정적 세그먼트 또는 동적 세그먼트를 활용한다.
수동 할당은 프로그래머가 원하는 크기의 메모리를 직접 지정해 할당하는 방법이다. C의 malloc()과 free(), C++의 new와 delete가 대표적이다. double *d = new double[4];는 네 개의 실수를 저장할 공간을 힙에 할당하고, 사용이 끝나면 delete[] d;로 해제한다.
3. 주소 바인딩을 위한 메모리 구조
프로그램의 메모리 구조는 크게 정적 세그먼트와 동적 세그먼트로 볼 수 있다. 정적 세그먼트에는 코드와 정적 데이터가 놓이고, 동적 세그먼트에는 힙과 스택이 있다. 강의 도표에서 힙은 낮은 쪽에서 한 방향으로, 스택은 반대쪽에서 다른 방향으로 사용 영역을 넓혀 간다.
자동 할당은 변수의 성격과 언어에 따라 정적 데이터 영역이나 스택 같은 동적 영역을 사용할 수 있다. 수동 할당은 동적 세그먼트의 힙을 사용한다. 따라서 ‘자동 할당은 무조건 스택’이라고 단정하면 안 되고, 자동 할당 가운데 정적 변수가 아닌 경우가 주로 스택 동적 변수에 해당한다고 이해해야 한다.
4. 주소의 정적·동적 바인딩
주소의 정적 바인딩은 로드 시점에 정적 세그먼트의 주소를 변수에 바인딩하고 프로그램 수행이 끝날 때까지 유지하는 방식이다. 이 방식으로 주소가 정해지는 변수가 정적 변수(static variable)이며, 수명은 프로그램 수행 전체이다. 초기 Fortran의 모든 변수가 대표 예이다.
주소의 동적 바인딩은 프로그램 수행 중 변수가 필요한 시점에 동적 세그먼트의 주소를 바인딩하는 방식이다. 이 방식의 변수는 사용하는 동적 영역에 따라 스택 동적 변수와 힙 동적 변수로 나뉜다.
5. 스택 동적 변수와 힙 동적 변수
스택 동적 변수는 스택에서 메모리를 할당받는 변수이다. 자동 할당을 이용하는 변수 가운데 정적 변수가 아닌 경우에 해당하며, 필요한 시점에 자동으로 할당되고 사용이 끝나면 자동으로 해제된다.
힙 동적 변수는 동적 세그먼트의 힙에서 메모리를 할당받는 변수이다. 프로그래머가 수동 할당한 변수와 동적 타입 바인딩을 사용하는 APL, SNOBOL 4, Python 등의 변수가 이에 해당한다. 수동 할당에서는 적절한 해제가 중요하며, C에서는 malloc()과 free(), C++에서는 new와 delete를 짝지어 사용한다.
| 변수 종류 | 주소 바인딩과 저장 영역 | 수명·할당 특징 |
|---|---|---|
| 정적 변수 | 로드 시점, 정적 세그먼트 | 프로그램 수행 전체에 걸쳐 주소 유지 |
| 스택 동적 변수 | 수행 중, 스택 | 필요한 시점에 자동 할당·해제 |
| 힙 동적 변수 | 수행 중, 힙 | 수동 할당 변수 또는 동적 타입 언어의 변수 |
관계 정리: 주소 바인딩이 유지되는 기간이 수명이다. 정적 변수는 프로그램 전체를 수명으로 하고, 동적 변수는 수행 중 필요한 기간에 주소가 바인딩된다. 동적 변수는 사용하는 영역에 따라 스택 동적 변수와 힙 동적 변수로 구분된다.
핵심 개념 정리
변수는 데이터를 저장하고 나중에 사용할 수 있도록 메모리를 추상화한 것으로, 변수명·타입·주소·값·수명·영역의 속성을 갖는다. 배런의 표기법은 변수명, 타입, 주소가 붙은 값 저장 공간의 관계를 시각적으로 보여 준다.
바인딩은 언어 구성 요소의 속성이 구체적으로 결정되는 현상이다. 언어 정의, 언어 구현, 컴파일, 링크, 로드, 수행 시점에 일어나며, 수행 중 변화 여부에 따라 정적 바인딩과 동적 바인딩으로 구분한다.
변수의 속성은 일반적으로 변수명, 타입, 주소, 값의 순서로 바인딩된다. 변수명과 타입은 명시적 또는 묵시적으로 정할 수 있고, 타입은 정적 또는 동적으로 바인딩될 수 있다. 주소 바인딩에는 자동·수동 할당과 정적·동적 바인딩이 있으며, 변수는 정적 변수, 스택 동적 변수, 힙 동적 변수로 구분된다.
최종 정리: 변수의 각 속성이 ‘무엇인지’, ‘언제 결정되는지’, ‘어떤 저장 영역과 연결되는지’를 분리해 판단해야 한다. 선언 방식과 타입 바인딩 시각을 구별하고, 할당·해제와 수명, 정적 세그먼트·스택·힙의 관계를 함께 묶어 이해하는 것이 핵심이다.
예상문제 20선
1. 변수에 대한 설명으로 가장 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
변수는 물리적 메모리 공간을 추상화하고 상대적인 이름으로 데이터를 저장하고 참조하게 한다.
2. 변수의 속성과 의미의 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
주소는 변수가 사용하는 메모리 위치이다. 수명은 주소가 바인딩된 기간이고, 영역은 변수명을 사용할 수 있는 범위이다.
3. 배런의 변수 표기법을 해석한 설명으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
변수명은 메모리 공간의 상대적인 이름이고 주소는 실제 저장 위치이다. 두 속성은 연결되지만 같은 문자열일 필요가 없다.
4. 바인딩의 정의로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
연산자의 의미, 타입 크기, 변수명·주소·값처럼 언어 구성 요소의 속성이 구체적으로 정해지는 현상이 바인딩이다.
5. 바인딩 시각과 대표 예의 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
변수의 타입은 대표적으로 컴파일 시점에 바인딩된다. 연산자의 의미는 언어 정의, 타입의 자릿수는 구현, 변수 값은 수행 시점의 예이다.
6. 정적 바인딩의 특징으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
수행 시점에 새로 바인딩되거나 해지되는 것은 동적 바인딩이다. 정적 바인딩은 수행 전에 결정되어 수행 중 변하지 않는다.
7. 동적 바인딩에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
동적 바인딩은 실행 상황에 따라 수행 중 바인딩이 변할 수 있어 유연하며 인터프리터 방식에 적합하다.
8. 변수 속성의 일반적인 바인딩 순서로 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
일반적으로 변수명, 타입, 주소, 값 순으로 바인딩된다. 값 바인딩은 프로그램 수행 중 여러 번 일어날 수 있다.
9. 묵시적 변수명 선언의 예로 가장 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
묵시적 선언은 별도의 선언문 없이 대입문 등에서 이름이 처음 사용될 때 변수명을 바인딩한다.
10. 타입의 묵시적 바인딩 사례로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
선언문에 int를 직접 적는 것은 명시적 타입 선언이다. 묵시적 선언은 이름이나 대입값에서 타입을 결정한다.
11. 타입의 동적 바인딩에 대한 설명으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
동적 타입 바인딩은 타입을 고정하지 않고 현재 대입되는 값에 맞추어 바꾼다. Python 등이 예이다.
12. 선언 방식과 타입 바인딩 시각의 관계에 대한 설명으로 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
명시 여부는 타입을 코드에 직접 적는지의 문제이고, 정적·동적 구분은 수행 중 타입 변화 여부의 문제이다.
13. 주소 바인딩에 관한 설명으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
변수의 수명은 변수가 메모리를 할당받은 기간, 즉 주소가 바인딩된 기간이다.
14. 자동 할당과 수동 할당의 비교로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
자동 할당은 선언과 타입에 따라 시스템이 공간을 배정하고, 수동 할당은 프로그래머가 필요한 크기를 지정해 주로 힙에서 할당한다.
15. 주소 바인딩을 위한 메모리 구조의 연결로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
정적 세그먼트에는 코드와 정적 데이터가 있고, 동적 세그먼트에는 힙과 스택이 있다. 수동 할당은 힙을 활용한다.
16. 주소의 정적 바인딩에 대한 설명으로 알맞은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
정적 주소 바인딩은 로드 시점에 정적 세그먼트의 주소를 바인딩해 프로그램 수행 전체 동안 유지한다.
17. 정적 변수의 특징으로 옳은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ①
정적 변수는 정적 주소 바인딩을 하며 프로그램이 수행되는 전체 기간 동안 메모리를 유지한다.
18. 스택 동적 변수에 대한 설명으로 옳지 않은 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ④
프로그램 전체 동안 주소가 유지되는 것은 정적 변수의 특징이다. 스택 동적 변수는 수행 중 필요한 기간에 자동 할당·해제된다.
19. 힙 동적 변수의 사례로 가장 적절한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ②
new로 배열 공간을 할당한 변수는 동적 세그먼트의 힙을 사용한다. 사용 후에는 delete[]로 수동 해제한다.
20. 변수의 영역과 수명을 바르게 비교한 것은?
정답입니다.
오답입니다. 답안을 다시 선택해 보세요.
정답 및 해설 보기
정답: ③
영역은 프로그램의 어느 부분에서 변수명을 사용할 수 있는지 나타내고, 수명은 변수가 메모리를 할당받아 주소가 바인딩된 기간이다.
댓글
댓글 쓰기