변수 스코프

7.1 왜 이름이 필요할까?

이름이 필요한 이유는 이름을 없애보면 쉽다.

데이터는 메모리에 적재되고, 사용시에 주소를 필요로 한다. 그러나 이 주소는 부르기 어려운 형태이다. “0x0299312에 있는 데이터를 불러와” 보다, “number라는 데이터를 불러와”가 더 사용하기 편한 형태인 것이다.

이는 IP 주소에서도 동일하게 적용된다. IP 주소는 숫자로 볼 시에는 복잡하기에 사용하기 어려운 형태이지만, 이를 DNS 서버를 거쳐서 부르기 쉬운 이름으로 대체하여 사용할 수 있다.

또한 이는 지구상의 위치를 표시할 때도 마찬가지이다. 위도와 경도를 통해 어느 위치를 표시한다면, “위도 35.69, 경도 139.75”라고 하기 보다, “XX시 OO구 AA동”이라고 칭하는게 더 부르기 쉽고 사용하기 쉬운 것이다.

어떻게 이름을 붙일까?

대응표를 이용하여 이름을 붙인다. 즉, 메모리 주소와 같이 부르기 어려운 원래의 이름이 있을 것이다. 그러나 이것은 그 자체로 사용하기 어려운 형태라는 문제를 갖고 있다. 따라서 이 문제를 해결하기 위해 사용하기 쉬운 이름과 그 원래의 이름을 대응시킨다. 그렇다면 원래의 이름에 내포된 문제를 해결할 수 있다. 이처럼 이름을 대응하여 사용하기 위해 대응표를 작성한다.

키포인트는 사용하기 어려운 이름에 사용하기 쉬운 이름을 대응시킨다는 것이다.

이름 충돌

위와 같이 Program A와 Program B가 같은 이름을 사용한다고 가정한다. 이때 Program A에서 X 변수를 변경했을 시에 의도치 않은 영향이 Program B에게까지 전파된다. 이러한 상황을 “충돌”했다고 한다.

사실상 자원을 공유하는 상황에는 항상 이러한 충돌이 발생한다.

해결방법

이름 충돌을 해결하기 위한 방법은 두 가지가 있다.

  1. 변수 이름 중복 제거
  2. 스코프 사용

여기선 스코프 사용하는 방법에 대해서 알아본다.

동적 스코프

“이름 충돌” 문제를 해결하기 위해 나온 스코프의 첫번째 해결 방법이 바로 동적 스코프이다. 동적 스코프는 “원래의 값을 다른 곳에 피신시켜두고 나중에 되돌린다”는 해결법이다.

$X = "Hello"

sub Program_A {
	$X_double_prime = $X
	$X = "Good Bye"
	$X = $X_double_prime 
}

sub Program_B {
	print "$X"
}

위와 같은 상황을 보면 X의 값을 먼저 X’’라는 변수에 피신시켜 놓는다. 그 다음에 X라는 변수에 Program A가 실행되는 동안에만 사용하고 싶은 변수를 넣어둔다. 그 다음에 Program A가 종료되기 직전에 다시 X’’를 참조하여 X에 원래의 값을 되돌린다. 그래서 최종적으로 Program B에는 영향이 가지 않도록 한다.

그러나 동적 스코프의 문제점은 Program A가 실행되는 동안에는 Program B까지 영향력이 전파된다는 것이다. 만약에 Program A 도중에 Program B를 실행된다면 영향력이 전파된 채로 결과물이 만들어지기 때문이다.

정적 스코프

동적 스코프의 문제를 해결하기 위해 나온 것이 정적 스코프이다. 정적 스코프는 아예 “스코프의 유효 범위를 구분하자”는 것이 아이디어이다.

이때 함수나 특정 단위들은 자신만의 스코프를 갖게 된다. 그래서 찾고자 하는 변수를 자신이 갖고 있는 스코프에서부터 먼저 탐색한다. 그리고 만약에 스코프에 찾고자 하는 것이 없을 시에 전역 대응표로 넘어가서 탐색한다.

참고사항으로 언어마다 동적 스코프, 정적 스코프를 구현하는 문법이 다르다.

참고문헌

코딩을 지탱하는 기술

좋은 웹페이지 즐겨찾기