Java에서 유효범위란, 프로그램이 커질때 여러가지 이유로 변수 혹은 이름이 충돌할 수 있다. 이를 해결하기 위해 고안된 개념이다. 스코프(Scope)라고도 부른다.
JavaScript에서도 활용되는 개념이고, 해당 변수가 접근할 수 있는 변수, 객체 그리고 함수의 집합이라고 정리할 수도 있다.
아래 두 코드를 비교해보자.
public class ScopeDemo {
static void a() {
int i = 0;
//여기서 선언된 i를 지역변수라고 한다.
}
public static void main(String[] args) {
for (int i = 0; i<5; i++) {
//for문 내에서 int를 통해 i를 선언
a();
System.out.println(i); }
}
위의 코드를 실행하면
0
1
2
3
4
가 나온다.
public class ScopeDemo2 {
static int i;
//여기서 i를 전역변수라고 한다.
static void a() {
i = 0;
}
public static void main(String[] args ){
for (i=0;i<5;i++) {
//i를 선언하지 않았음. 위 전역변수에서 선언한것으로 끝.
a();
System.out.println(i);
}
}
}
위의 코드를 실행하면,
0이 무제한으로 출력된다.
이 두 코드의 차이점은 무엇인가.
두번째 코드에서는 for문에서 i를 변수 선언하는 과정이 없으므로 위의 전역변수에서 선언한 i=0이 계속 출력되는 것이다.
Java에서 변수를 선언한다는 것은 변수의 값을 설정하는 것을 넘어 유효범위를 설정하는 것이다.
두번째 코드처럼 변수를 클래스 바로 밑에서 선언해버리면, 선언한 변수는 클래스 내 모든 메소드 및 for문에서 적용되버린다. (전역변수)
그러나, 중괄호 안에서 변수를 선언하면 그 중괄호 안에서만 유효한 변수가 된다.