Scope

Scope(유효범위)란 특정 변수가 적용되는 범위를 뜻하는 개념으로

프로그램이 커지면 여러 가지 이유로 변수 등의 이름이 충돌하게 되는데, 이를 해결하기 위해서 고안된 것이 유효범위라는 개념이다.

Static Scope(정적 스코프)

정의 : 사용되는 시점에서의 유효범위를 사용하는 것이 아니라 정의된 시점에서의 유효범위를 사용하는 것이다.

Lexical Scope(렉시컬 스코프)라고도 한다.

public class ScopeDemo {
    static int i = 5;
 
    static void a() {
        int i = 10;
        b();
    }
 
    static void b() {
        System.out.println(i);
    }
 
    public static void main(String[] args) {
        a();
    }
 
}

위의 로직에서 메소드 a가 메소드 b를 호출하고 있는데 메소드 b에는 변수 i의 값이 존재하지 않는다.

이 상태에서 메소드 a를 호출하면 메소드 b에서 System.out.println(i)를 했을 때 메소드 a의 변수 i가 아닌 클래스 변수 i를 사용한다.

메소드 내(b)에서 지역변수가 존재하지 않는다면 그 메소드가 소속된 클래스의 전역변수를 사용하게 된다는 것이 정적 스코프의 대표적인 예라고 할 수 있다.

Dynamic Scope(동적 스코프)

동적 스코프라는 것도 있다. 만약 메소드 b의 결과가 10이라면 메소드 b는 메소드 a의 유효범위에 소속된 것이라고 할 수 있다. 하지만 자바는 동적 스코프를 채택하지 않고 있다.

대부분의 현대적인 언어들이 정적 스코프 방식을 선택하고 있다.

reference

https://opentutorials.org/module/516/5447