변수 스코프

sith-call.dev·2022년 3월 24일
0

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를 실행된다면 영향력이 전파된 채로 결과물이 만들어지기 때문이다.

정적 스코프

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

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

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

var, let, const

var로 선언한 키워드는 전역 레벨 스코프나 함수 레벨 스코프를 갖는다. 즉 위의 대응표에서 모든 Program이 접근할 수 있는 대응표에 변수가 저장된다는 뜻이다. 그러나 전역 변수 사용은 매우 조심스럽다. 왜냐하면 전역 변수를 사용하게 되면 프로그램 모듈 간의 결합도를 매우 높인다. 즉, 파급력이 높기 때문에 산탄총 수술 같은 사건이 발생할 수 있다. 따라서 결합도를 낮추기 위해선 블럭 레벨 스코프에서 변수를 선언할 수 있어야 한다. 이는 동적 스코프에서 본 그림 대응표처럼 변수가 스코프를 가져야 함을 뜻한다. 그래서 자바스크립트도 이러한 문제점을 해결하기 위해서 let, const 키워드를 도입하여 블록 레벨 스코프에서 변수를 선언할 수 있게 하였다.

참고문헌

코딩을 지탱하는 기술

profile
Try again, Fail again, Fail better

0개의 댓글