[프로그래밍언어론] 변수의 영역
변수의 영역
변수의 영역
- 프로그램에서 변수를 사용할 수 있는 범위
- 변수에 값을 대입하거나 값을 읽어올 수 있는 범위
- 영역의 시작 → 변수가 선언된 곳
변수의 영역과 수명의 관계
- 영역의 시작 → 변수 선언 위치
- 수명의 시작
- 동적 바인딩 → 변수 선언 위치
- 동적 바인딩 → 변수 선언 위치
블록
- 프로그램 문장들의 묶음
- 영역을 구분해주는 단위
-
블록 안에서 변수 선언이 가능
- 블록의 표현이나 적용 기준은 언어별로 다름
- Algol 60 → 복합문(begin ~ end)
- C, C++, Java → 복합문 ({~}), 함수, 클래스
- Pascal → 주프로그램, 서브프로그램
- Algol 60 → 복합문(begin ~ end)
블록과 변수
- 지역 변수
- 블록 안에서 선언된 변수
- 블록 안에서 선언된 변수
- 비 지역 변수
- 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수
- 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수
참조 환경
- 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음
- 해당 위치의 모든 지역변수와 비지역변수로 구성
- 해당 위치의 모든 지역변수와 비지역변수로 구성
영역 규칙
- 변수의 참조 위치를 결정하는 방법
- 종류 → 정적 영역 규칙, 동적 영역 규칙
- 종류 → 정적 영역 규칙, 동적 영역 규칙
- 자유변수
- 현재 블록에서 선언되지 않고, 사용하려는 변수
- 영역 규칙에 따라 참조 위치를 결정
- 참조 위치를 찾은 경우(선언된 경우) → 비지역변수
- 참조 위치를 찾지 못한 경우 → 오류
- 참조 위치를 찾은 경우(선언된 경우) → 비지역변수
- 현재 블록에서 선언되지 않고, 사용하려는 변수
정적 영역 규칙
- 블록들의 정적 내포 관계를 이용
- 정적 내포 관계 → 블록의 문맥적인 포함 관계
- 사전적 영역 규칙
- 정적 내포 관계 → 블록의 문맥적인 포함 관계
- 용어
- 정적 조상
- 현 블록을 문맥적으로 포함하는 모든 블록들
- 현 블록을 문맥적으로 포함하는 모든 블록들
- 정적 부모
- 현 블록에 가장 가까운 정적 조상
- 현 블록에 가장 가까운 정적 조상
- 정적 조상
정적 영역 규칙의 적용 방법
- 사용하려는 변수의 이름에 대한 선언이 현재 블록안에 존재 → 지역변수
- 자유변수라면 현재 블록의 정적 부모에 대해
- 자유 변수 이름에 대한 선언이 존재 → 비지역변수
- 선언이 없으면 그 블록의 정적 부모에 대해 반복
- 자유 변수 이름에 대한 선언이 존재 → 비지역변수
- 가장 바깥 영역까지 선언을 찾지 못함 → 오류
영역 구멍
- 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역
동적 영역 규칙
- 블록들의 동적 내포 관계를 이용
- 동적 내포 관계 → 서브프로그램의 호출 관계
- 동적 내포 관계 → 서브프로그램의 호출 관계
- 프로그램 수행시점에서만 판단 가능
동적 영역 규칙의 적용 방법
- 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역 변수
- 자유변수라면 현재 블록을 호출한 블록에 대해
- 자유변수 이름에 대한 선언이 존재 → 비지역변수
- 선언이 없으면 그 블록을 호출한 블록에 대해 반복
- 자유변수 이름에 대한 선언이 존재 → 비지역변수
- 최종 호출자 영역까지 선언을 찾지 못함
→ 오류
영역 규칙의 비교
- 정적 영역 규칙
- 컴파일 시점에 변수의 참조 위치를 결정
- 정적 타입 검사 가능, 빠른 수행 속도
- Algol 60, Pascal, C/C++, Java, Python 등 대부분
- 컴파일 시점에 변수의 참조 위치를 결정
- 동적 영역 규칙
- 수행 시점에 변수의 참조 위치를 결정
- 정적 타입 검사 불가능, 느린 수행 속도
- LISP 등의 인터프리터 방식 언어
- 수행 시점에 변수의 참조 위치를 결정
이름 공간
전역 변수
- 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
- 영역 : 프로그램 전체
- 모든 블록에서 비지역 변수로 취급
영역 구멍에서의 전역변수 사용
- 영역 연산자를 이용하면 해결 가능
- C++의 영역 연산자 → ::
- C++의 영역 연산자 → ::
이름 공간
- 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
-
영역 자체의 이름을 가짐
- 이름 공간 내의 변수/함수를 이름 공간 밖에서 사용하는 방법
- 이름 공간의 이름과 영역 연산자 ::를 사용
- 예약어 using을 이용
- 이름 공간의 이름과 영역 연산자 ::를 사용
- 이름 공간과 영역 구멍
- 이름 공간의 변수와 지역 변수가 중첩된 경우
- 영역 연산자를 이용해서 해결
- 이름 공간의 변수와 지역 변수가 중첩된 경우