들어가며
변수의 스코프(scope)란
임의의 변수에 대한
'변수의 접근 가능 영역'
또는
'변수가 소멸되지 않고
존재할 수 있는 영역'을
의미한다.
가시성(visibility)
지금까지 중괄호가 사용되었던
때를 정리해 보면 다음과 같다.
- if문 또는 if ~ else문에서 사용되었다.
- 다양한 반복문과 switch문에서 사용되었다.
- 메소드의 몸체 부분을 감싸는 용도로 사용되었다.
이처럼 중괄호는 다양한
경우에 사용된다.
그런데 이렇듯 중괄호로
특정 영역을 감싸면,
해당 영역은 변수에 관한
별도의 스코프를 형성하게
된다.
예를 들어서 다음과 같이
중괄호 내에 변수 num이
선언되면,
if (...) {
int num = 5;
. . .
}
이 변수 num은 중괄호
내에서만 접근이 가능하며,
중괄호를 벗어나는 순간
소멸되어
접근이 불가능한 변수가
된다.
그럼 이에 대한 내용을
다음 예제를 통해서
살펴보겠다.
public class temp {
public static void main(String[] args){
boolean ste = true;
int num1 = 11;
if (ste){
// int num1 = 22; // 주석을 해제하면 컴파일 오류 발생
num1++;
System.out.println(num1);
}
{
int num2 = 33;
num2++;
System.out.println(num2);
}
// System.out.println(num2); // 주석을 해제하면 컴파일 오류 발생
}
}
/*
12
34
*/
예제의 4행에 변수 num1이
선언되었다.
int num1 = 11; // 예제 4행의 변수 선언
이 변수를 감싸는 것은
main 메소드의 중괄호이다.
따라서 이 변수는 선언된
이후로
main 메소드 내에서만
접근이 가능하다.
혹 main 메소드 내에서
중괄호를 이용해
별도의 영역을 형성해도
마찬가지이다.
즉 8행과 9행에서 접근하는
변수 num1은
4행에서 선언한 변수이다.
반면 main 메소드 내에서는
이후로
num1이라는 이름의 변수를
추가로 선언하지 못한다.
때문에 위예제 7행의 주석을
해제하면
컴파일 오류가 발생한다.
중괄호를 이용해서 별도의
영역을 형성하더라도
그 영역이 main 메소드
내라면
num1이라는 이름의 변수는
선언할 수 없다.
이제 12 ~ 16행을 관찰하자.
{
int num2 = 33;
num2++;
System.out.println(num2);
}
이처럼 원하면 언제든지
중괄호를 이용하여
별도의 영역을 형성할
수 있다.
물론 위의 영역에 선언된
변수 num2는
위의 영역에서만 접근
가능하다.
따라서 예제 18행의 주석을
해제하면
컴파일 오류가 발생한다.
그리고 중괄호 내부에 선언된
변수는 아니지만
for문의 초기화 부분에 선언된
변수와 메소드의 매개변수도
해당 영역 내에서만 유효한
변수이다.
즉 다음 for문에 선언된 변수
num은 for문 내에서만
유효하고 접근 가능한 변수이다.
for (int num = 1; num < 5; num++) {
. . . // 변수 num의 접근 가능 영역, 추가로 변수 num 선언 불가
}
마찬가지로 다음 매개변수 num
역시
해당 메소드 내에서만 유효하고
접근 가능한 변수이다.
public static void defence_fomula {
. . . // 변수 num의 접근 가능 영역, 추가로 변수 num 선언 불가
}
지금까지 설명한 중괄호 내에
선언된 변수들을 가리켜
'지역 변수(Local Variable)'라 한다.
그리고 for문의 초기화 부분에
선언되는
변수와 매개변수까지도
지역변수의 범주에 포함된다.
그런데 이러한 지역변수들이
갖는 중요한 특징이 하나 있다.
지역변수는 선언된 지역을 벗어나면
메모리 공간에서 소멸된다.
즉, 선언된 지역을 벗어나면
단순히 접근만 불가한 것이 아닌,
메모리상에서 삭제되는 것이다.
참고 및 출처
|