728x90

 

1. 영역의 개요

 

✅ 변수의 영역(scope)

출처: 한국방송통신대학교

  • 프로그램에서 변수를 사용할 수 있는 범위
  • 변수에 값을 대입하거나 값을 읽어올 수 있는 범위
  • 영역의 시작: 변수 선언 위치
  • 수명의 시작
    • 수명: 변수가 메모리를 할당받는 기간 
    • 동적 바인딩: 변수 선언 위치
    • 정적 바인딩: 프로그램이 수행되는 시점

 

 

 

 

 

✅ 블록(block)

출처: 한국방송통신대학교

  • 프로그램 문장들의 묶음
  • 영역을 구분해주는 단위
  • 블록의 표현이나 적용 기준은 언어별로 다름
    • Algol 60: 복합문(begin ~ end)
    • C, C++, Java: 복합문({~}), 함수, 클래스
    • Pascal: 주 프로그램, 서브 프로그램 → 복합문(begin~end)는 블록이 아님
  • 블록 안에서 변수 선언이 가능 (※해당 변수 영역의 끝: 블록이 끝나는 지점)

 

 

 

 

 

✅ 블록과 변수

출처: 한국방송통신대학교

  • 지역변수(local variable): 블록 안에서 선언된 변수
  • 비지역변수(non-local variable): 블록 밖에서 선언되었지만 블록 안에서 사용될 수 있는 변수
  • 지역변수와 비지역변수는 상대적인 개념

 

 

 

 

 

✅ 참조 환경(reference environment)

출처: 한국방송통신대학교

  • 프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음 
  • 해당 위치의 모든 지역변수와 비지역변수로 구성
  • 위 그림은 정적 영역 규칙을 적용(동적 영영 규칙을 적용할 경우 다른 결과를 얻을 수 있음)

 

 

 

 

 

 


2. 영역 규칙

 

✅ 영역 규칙(scope rule)

  • 변수의 참조 위치를 결정하는 방법
    1. 정적 영역 규칙
    2. 동적 영역 규칙
  • 자유변수(free variable)
    • 현재 블록에서 선언되지 않고 사용하려는 변수
    • 영역 규칙에 따라 참조 위치를 결정
      1. 참조 위치를 찾은 경우(선언된 경우): 비지역변수
      2. 참조 위치를 찾지 못한 경우: 오류

Sub2 블록에 선언되지 않은 A는 자유변수(비지역변수)

 

 

 

 

 

✅ 정적 영역 규칙 = 사전적 영역 규칙(lexical scope rule)

: 블록들의 정적 내포 관계(블록의 문맥적인 포함 관계)를 이용

 

 

 

🔸용어

블록 C의 부모: B / 블록 C의 조상: B, A

  • 정적 조상(static ancestors): 현 블록을 문맥적으로 포함하는 모든 블록들
  • 정적 부모(static parent): 현 블록에 가장 가까운 정적 조상

 

 

 

🔸적용 방법

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

 

 

 

 

✅ 영역 구멍(scope hole)

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

 

 

 

 

 

✅ 동적 영역 규칙

  • 블록들의 동적 내포 관계(서브프로그램의 호출 관계)를 이용
  • 프로그램 수행시점에서만 판단 가능

 

 

 

🔸적용 방법

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

 

 

 

 

 

🔸영역 규칙의 비교

정적 영역 규칙 동적 영역 규칙
- 컴파일 시점에서 변수의 참조 위치를 결정
- 정적 타입 검사 가능, 빠른 수행 속도
- Algol 60, Pascal, C/C++, Java, Python 등 대부분의 언어
- 수행 시점에 변수의 참조 위치를 결정
- 정적 타입 검사 불가능, 느린 수행 속도
- LISP 등의 인터프리터 방식 언어

 

 

 

 

 

 

 


3. 이름 공간

 

✅ 전역 변수(global variable)

출처: 한국방송통신대학교

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

 

 

 

 

 

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

  • 영역 구멍: 어떤 블록 내에서 전역변수 이름과 동일한 지역변수를 사용할 경우, 지역변수가 우선권을 가지기 때문에 전역 변수는 해당 블록 내에서 보이지 않음
  • 영역 연산자(scope operator)를 이용하면 해결 가능
    • C++의 영역 연산자 → ::

출처: 한국방송통신대학교

 

 

 

 

 

✅ 이름 공간(name space)

출처: 한국방송통신대학교

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

 

 

 

🔸이름 공간 내의 변수/함수를 이름 공간 밖에서 사용하는 방법

출처: 한국방송통신대학교

  1. 이름 공간의 이름과 영역 연산자 ::를 이용
  2. 예약어 using을 이용

 

 

 

🔸이름 공간과 영역 구멍

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

 

 

 

 

728x90

+ Recent posts