본문 바로가기
척척학사/프로그래밍 언어론

프로그래밍 언어론 변수의 영역

by 학사쟁이 2023. 10. 24.
반응형

영역의 개요

▷프로그램에서  변수를 사용할 수 있는 범위를 말한다. 또는 변수에 값을 대입하거나 값을 읽어올 수 있는 범위를 말하기도 한다. 영역의 시작은 변수가 선언된 곳이다.

x = 0;
int x;
x = 1 *5;

변수의 x가 선언된 곳은 2번째 줄이기에 변수 x는 2번째 줄과 3번째 줄이 영역이 된다.

변수의 영역 수명의 관계

▷ 변수의 영역의 시작은 변수선언 위치이다.

수명의 시작은 동적, 정적 바이딩에 따라 다른데

▷동적바인딩 : 변수 선언 위치

▷정적 바인딩 : 프로그램이 수행되는 시

x = 0;
int x;
x = 1 *5;
변수 선언 위치는 2,3줄이다. 변수 x의 영역과 동적바인딩 수명이 같다.
x = 0;
int x;
x = 1 *5;
변수 x의 수명은 정적바이딩의 경우 프로그램의 시작이기 때문에 1~3줄이다. 하지만 수명은 첫째줄부터이지만 오류가 나타난다. x의 변수영역의 시작은 두 번째 줄부터이기 때문이다.

블록

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

▷영역의 끝은 블록이 끝나는 지점이다.

{
int x;
x = 1 *5;
}
if x >0.....
변수 x의 영역밖에서 변수 x가 있음으로 오류가 발생한다.

블록의 표현이나 적용의 기준은 언어마다 다른데 Algol은 복합문 begin~end로 표현하고, C, C++, JAVA는 복합문 { }와 함수, 클래스를 이용하며 Pascal은 주프로그램, 서브프로그램(여기서 사용하는 begin~end는 블록이 아니다.)

▷지역변수

블록 안에서 선언된변수를 말한다. { 여기 }

▷비지역변수

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

예를 들어 각각 A, B, C의 변수를 블록으로 입력했다면.

{
int A;
{
int B;
B= A +1;
}
}

{
int C;
}

두 번째 줄의 intA는 지역변수이다.
5번째 줄을 잘 보면 B는 해당블록에서 정의된 지역변수이고 A는 블록밖에 더 넓은 블록에서 선언되어 사용은 가능하지만 비지역변수에 해당한다.

참조환경

▷프로그램의 한 위치에서 사용할 수 있는 모든 변수의 모음을 말한다

▷해당위치의 모든 지역변수와 비지역변수로 구성된다.

{
int a;
...(A)  →참조환경 : 지역변수 a
{
int b;
...(B) → 참조환경 : 지역변수 b , 비지역변수 a
{
int c;
...(C) → 참조환경 : 지역변수 c, 비지역변수 a, b
}
}
}

영역규칙

▷ 변수의 참조위치를 결정하는 방법을 말한다. 종류는 정적영역규칙, 동적영역규칙이 있다.

▷ 자유 변수란 현재 블록에서 선언되지 않고(지역변수는 아니라는 것) 사용하려는 변수이다. 그래서 영역 규칙에 따라 참조 위치를 결정해야 된다. 이때 참조 위치를 찾은 경우에 비지역변수이다. 하지만 참조 위치를 찾지 못한 경우는 오류이다.

 

정적영역 규칙 : 블록들의 정적 내포 관계를 이용하는 것.

정적내포관계로 블록의 문맥적인 포함관계 또는 사전적 영역 규칙이라고 한다.

※정적이라고 하는 이유는 프로그램 수행과 관련이 없기 때문이다.

정적 조상

현재 블록을 문맥적으로 포함하는 모든 블록을 말한다.

정적 부모

정적 조상중에 현 블록에서 가장 가까운 정적조상을 말한다.

정적 영역 규칙 적용방법

1. 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재한다. 지역변수.

2. 자유변수라면 현재 블록의 정적 부모에 대해서 변수선언이 있다면 비지역변수. 또는 선언이 없다면 그 블록의 정적부모에 대해서 반복해서 찾음

3. 가장 끝까지 찾았는데 없다면. 오류

 

영역구멍(scope hole)

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

int x;... A
x=1;
{
int x;
x=2... B
}
}
x=1의 영역은 전체에 해당되나 파란 영역 안에는 같은 이름의 지역변수가 있어서 A는 B구역에서 영역구멍이다.

동적 영역규칙 : 블록드르이 동적 내포 관계를 이용

동적내포관계로 서브프로그램의 호출관계이고 동적이기에 프로그램 수행시점에서만 판단이 가능하다.

독적영역규칙의 적용방법

1. 사용하려는 변수의 이름에 대한 선언이 현재 블록 안에 존재하면 지역변수

2. 자유변수라면 현재 블록을 호출한 블록에 대해 자유변수 이름에 대한 선언이 존재한다면 비지역변수, 선언이 없으면 그 블록을 호출한 블록에 대해만

3. 최종 호출자 영역까지 선언을 찾지 못한다면 오류

 

결국 정적영역과 동적영역은 가까운 블록, 호출한 블록으로 생각하면 된다.

 

이름공간

전역변수

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

그렇다면 영역 구멍에서 전역변수를 사용할 수 있을까?

이경우 영역 여난자를 이용하면 해결할 수 있다.

C++의 영역연산자는 : :

#include <iostream>
int i=0;
int main()
{
int i=5;
i++;
: : i++;
cout << "local i=" << i << endl;
cout << "nonlocal i=" << : :i << endl;
retrun 0;
}
결괏값
local i= 6
nonlocal i=1

이름공간

▷관련성이 높은 변수와 함수를 하나의 묶음으로 관리하는 영역을 말하고 영역자체에 이름을 갖는다.

namespace JJ{
int j=0;
void Output(){
cout << "j="<<j<<endl;
}}

JJ라는 이름공간.

이름공간 내에 있는 변수나 함수를  이름공간 밖에서 사용하는 방법

#include <iostream>
namespace JJ {
int j=0;
void Output(){
cout << "j="<<j<<endl;
}}

int main(void) {
JJ : :j++;
JJ : : Output();   // k=1; ▷ 이름공간의 이름과 영역연산자 : :를 이용


using namespace JJ; ▷ 예약어 using을 사용

j++;
Output()  //k =2;
return 0;  
}

이름공간에 영영 구멍이 있는 경우는 마찬가지로 더우선권이 있는 같은 이름의 지역변수가 지정된다면 이는 영역구멍이라 하고 : :(영역연산자)를 사용하여 이름공간의 변수를 사용할 수 있다.

반응형

'척척학사 > 프로그래밍 언어론' 카테고리의 다른 글

복합타입  (0) 2023.11.04
프로그래밍 언어 타입  (1) 2023.10.28
변수와 바인딩  (0) 2023.10.12
프로그래밍 언어의 구현  (1) 2023.10.04
프로그래밍 언어론 구문분석  (1) 2023.09.15