변수의 영역

변수의 영역

  • 프로그램에서 변수를 사용할 수 있는 범위
  • 변수에 값을 대입하거나 값을 읽어올 수 있는 범위
  • 영역의 시작 → 변수가 선언된 곳

변수의 영역과 수명의 관계

  • 영역의 시작 → 변수 선언 위치
  • 수명의 시작
    • 동적 바인딩 → 변수 선언 위치

블록

  • 프로그램 문장들의 묶음
  • 영역을 구분해주는 단위
  • 블록 안에서 변수 선언이 가능

  • 블록의 표현이나 적용 기준은 언어별로 다름
    • Algol 60 → 복합문(begin ~ end)
    • C, C++, Java → 복합문 ({~}), 함수, 클래스
    • Pascal → 주프로그램, 서브프로그램

블록과 변수

  • 지역 변수
    • 블록 안에서 선언된 변수

  • 비 지역 변수
    • 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수

참조 환경

  • 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음
    • 해당 위치의 모든 지역변수와 비지역변수로 구성

영역 규칙

  • 변수의 참조 위치를 결정하는 방법
    • 종류 → 정적 영역 규칙, 동적 영역 규칙

  • 자유변수
    • 현재 블록에서 선언되지 않고, 사용하려는 변수
    • 영역 규칙에 따라 참조 위치를 결정
      • 참조 위치를 찾은 경우(선언된 경우) → 비지역변수
      • 참조 위치를 찾지 못한 경우 → 오류

정적 영역 규칙

  • 블록들의 정적 내포 관계를 이용
    • 정적 내포 관계 → 블록의 문맥적인 포함 관계
    • 사전적 영역 규칙

  • 용어
    • 정적 조상
      • 현 블록을 문맥적으로 포함하는 모든 블록들
    • 정적 부모
      • 현 블록에 가장 가까운 정적 조상

정적 영역 규칙의 적용 방법

  1. 사용하려는 변수의 이름에 대한 선언이 현재 블록안에 존재 → 지역변수
  2. 자유변수라면 현재 블록의 정적 부모에 대해
    1. 자유 변수 이름에 대한 선언이 존재 → 비지역변수
    2. 선언이 없으면 그 블록의 정적 부모에 대해 반복
  3. 가장 바깥 영역까지 선언을 찾지 못함 → 오류

영역 구멍

  • 비지역변수가 같은 이름의 지역변수 때문에 보이지 않는 영역

동적 영역 규칙

  • 블록들의 동적 내포 관계를 이용
    • 동적 내포 관계 → 서브프로그램의 호출 관계

  • 프로그램 수행시점에서만 판단 가능

동적 영역 규칙의 적용 방법

  1. 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재 → 지역 변수
  2. 자유변수라면 현재 블록을 호출한 블록에 대해
    1. 자유변수 이름에 대한 선언이 존재 → 비지역변수
    2. 선언이 없으면 그 블록을 호출한 블록에 대해 반복
  3. 최종 호출자 영역까지 선언을 찾지 못함
    → 오류

영역 규칙의 비교

  • 정적 영역 규칙
    • 컴파일 시점에 변수의 참조 위치를 결정
    • 정적 타입 검사 가능, 빠른 수행 속도
    • Algol 60, Pascal, C/C++, Java, Python 등 대부분

  • 동적 영역 규칙
    • 수행 시점에 변수의 참조 위치를 결정
    • 정적 타입 검사 불가능, 느린 수행 속도
    • LISP 등의 인터프리터 방식 언어

이름 공간

전역 변수

  • 어떤 블록에도 포함되지 않는 곳에서 선언된 변수
  • 영역 : 프로그램 전체
  • 모든 블록에서 비지역 변수로 취급

영역 구멍에서의 전역변수 사용

  • 영역 연산자를 이용하면 해결 가능
    • C++의 영역 연산자 → ::

이름 공간

  • 관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역
  • 영역 자체의 이름을 가짐

  • 이름 공간 내의 변수/함수를 이름 공간 밖에서 사용하는 방법
    • 이름 공간의 이름과 영역 연산자 ::를 사용
    • 예약어 using을 이용

  • 이름 공간과 영역 구멍
    • 이름 공간의 변수와 지역 변수가 중첩된 경우
    • 영역 연산자를 이용해서 해결

Updated: