Programming Note
변수의 Scope란
Jeyeon
2024. 12. 18. 17:25
프로그래밍 언어론에서는 변수의 Scope(이하 스코프)에 대한 내용을 다룬다. 스코프는 변수에 접근할 수 있는 범위를 말한다.
1. Global Scope & Local Scope
전역 스코프(Global Scope)
가장 바깥쪽에 있는 레벨의 스코프를 전역 스코프라고 한다. 이 전역 스코프 레벨에 선언되는 변수를 전역 변수라고 한다.
지역 스코프(Local Scope)
전역 스코프 내의 블럭을 모두 지역 스코프라고 한다. 또한 이 스코프 내에 선언된 변수를 지역 변수라고 한다.
만약 이러한 스코프가 중첩되어 있고 상위 스코프에 선언된 변수와 동일한 이름으로 하위 스코프에 선언된 경우 가장 인접한 스코프에 선언된 변수가 우선 순위를 갖는다.
//전역 스코프
const a = 100; //전역 변수
function test(){
//지역 스코프
const a = 10; //지역 변수
console.log(a); //인접한 스코프의 변수인 (a=10)을 참조
}
2. Block Level Scope & Function Level Scope
블럭 레벨 스코프(Block Level Scope)
블럭 레벨 스코프는 변수가 선언된 블럭 내에서만 접근이 가능한 스코프이다. C언어 기반 언어의 변수는 모두 블럭 레벨 스코프를 따른다.
//Java 언어에서 블럭 레벨 스코프
public static void main(String[] args){
int a = 10;
if(a == 0){
int b = a+10;
}
System.out.println(b); //해당 스코프에 b 변수 없음. 오류.
}
함수 레벨 스코프(Function Level Scope)
함수 레벨 스코프는 변수가 선언된 함수 내에서 접근이 가능한 스코프이다. 함수 지역 스코프 내에 중첩된 스코프 어디에 선언되어 있든 같은 함수라면 접근할 수 있는 것이다.
//Javascript에서 함수 레벨 스코프를 가지는 var 변수
function test(){
var a = 10;
if(a === 0) {
var b = a + 10;
}
console.log(b); //20 출력
}
+ 자바스크립트의 변수 선언 예약어 let, const는 블럭 레벨 스코프, var은 함수 레벨 스코프를 따른다.
3. 상위 스코프 탐색
렉시컬 스코프(Lexical Scope)
상위 스코프가 선언 위치에 따라 결정되는 것을 렉시컬 스코프라 한다.
const x = 100;
function test() {
var x = 10;
testPrint(); // testPrint 내부의 x 참조는 선언 위치에 따라 전역변수 x를 참조
}
function testPrint() {
console.log(x);
}
test(); //100 출력
testPrint(); //100 출력
동적 스코프(Dynamic Scope)
상위 스코프가 호출 위치에 따라 결정되는 것을 동적 스코프라 한다. 우선 자바스크립트는 동적 스코프를 지원하지 않고 렉시컬 스코프만 지원한다. 아래는 자바스크립트 언어로 작성되어 있지만, 동적 스코프일 경우를 가정한 실행 결과이다.
const x = 100;
function test() {
var x = 10;
testPrint(); // testPrint 내부의 x 참조는 호출 위치에 따라 지역변수 x를 참조
}
function testPrint() {
console.log(x);
}
test(); //10 출력
testPrint(); //100 출력