식별자 영역 (정적 영역 규칙, 동적 영역 규칙)

rin12·2020년 10월 17일
2

CSW

목록 보기
8/12
post-thumbnail

영역 (Scope)

: 프로그램에서 사용되는 식별자가 의미를 가질 수 있는 범위를 뜻함

블록 (Block)

: 복합문 안에 변수, 레이블과 같은 지역 식별자를 선언하는 묶인 부분. 블록이 실행되는 동안에만 변수들이 의미를 가지게 됨

영역 규칙

: 이름의 참조가 변수와 어떻게 연관되는지 결정해주며 비지역변수에 대한 참조와 그 선언과의 연관을 규정

영역규칙은 정적 영역 규칙과 동적 영역 규칙, 두가지로 나뉘게 된다.

정적 영역 규칙

: 변수의 영역이 실행 전에 결정되며 이름 참조를 변수와 연관시키기 위해서 해당 선언문을 먼저 찾는다.

이름에 해당하는 변수를 찾을 때, 자신을 포함하고 있는 블록에서 선언되었는지를 탐색한 후 없으면 그 바깥쪽 블록에서 선언되었는지 살펴보게 된다.
대부분 명령형 언어에서 사용.

정적 영역 규칙은 프로그램이 개발된 후, 수정이 필요할 때 문제가 발생하게 되며 영역 구멍이 발생하게 된다.

영역 구멍이란 내포된 블록 사이에 동일 지역 변수를 선언하면 바깥 블록의 지역변수는 내부 블록 구간에서 사용할 수 없는 현상.

이 변수들이 정적 영역 규칙을 따르게 된다면 블록 C에서 영역 구멍이 발생.

블록 C에서 변수 a,b,x,y가 재선언되어 블록 C에서 벗어날 때까지 이 변수는 블록 A에서 선언된 속성은 무효가 되는데 이러한 현상을 영역 구멍이라고 한다.

블록 C에서는 변수 a와 b가 정수형으로 사용되고 블록 C외에서는 블록 A에서 정의한 실수형으로 사용되는 문제점이 있다.

동적 영역 규칙

: 이름에 해당하는 변수를 찾을 때 호출 순서에 기반하며 식별자의 사용 영역을 프로그램 싫랭 순서에 의해 결정.

동적 영역 규칙은 아래와 같이 적용된다..

  1. 먼저 자신을 포함하고 있는 블록에서 선언되었는지 살펴본 후
  2. 없으면 자신을 포함한 블록을 호출한 문장을 포함하고 있는 블록에서 선언된 것인지 살펴본다.
  3. 해당 변수를 찾을 때까지 반복

예시를 통해 정적 영역 규칙과 동적 영역 규칙이 어떻게 적용되는지 살펴보자.

정적 영역 규칙을 적용한다면 a와 b를 선언하고 14행에서 a에 0을, b에 1을 저장 후 func를 호출. func를 호출하면 8행에서 변수 a와 b를 선언하는데 위에서 선언한 변수와 이름은 같지만 전혀 다른 변수이다. func에서 a에 2를 b에 3을 저장하고 print를 호출한다. print를 호출하면 5행에서 a와 b 값을 출력한다. 정적 영역 규칙에 따라 print 블록에서 a와 b를 선언하고 있는지 살펴보았는데 선언된 부분이 없으니 그 바깥쪽 블록에서 a와 b를 찾는다. 2행에서 선언하고 있으므로 a에 0을 b에 1을 저장했으니 0과 1를 출력된다.




동적 영역 규칙을 적용하면 실행 순서에 의해 영역이 저장된다. 5행을 포함한 블록에서 a와 b를 선언하고 있는지 살펴보았는데 선언된 게 없다. 동적 규칙에 의해 print를 호출한 문장을 포함하고 있는 블록(11행 func)으로 돌아가서 살펴본다. func의 8행에서 선언한 것을 볼 수 있다. 그러므로 a에 2, b에 3을 저장했으므로 2와 3이 출력된다.

0개의 댓글