시작하며
여러분 안녕하세요!
DreamHanks의 254cm입니다.
이번에는 변수의 범위에 대해서 설명하겠습니다.
Java의 전체 기사는 여기를 클릭해 주세요.
이전 기사는 [Java개발] 제12회 final에 대해서 배워봤습니다.
변수의 범위
변수의 범위는 변수의 유효범위를 의미하는 것입니다.
변수를 어디까지 참조할 수 있는지, 이름이 중복되어도 되는지가 범위에 의해 결정됩니다.
스코프는 {} 괄호에서 구분할 수 있습니다.
변수는 자신의 선언이 포함되어 있는 괄호와 그 괄호에 포함되어 있는 괄호에서 사용이 됩니다.
로컬 변수의 범위
로컬변수는 메소드의 괄호안에 선언된 변수를 의미합니다.
로컬변수는 선언될 때 Stack영역에 생성되고 괄호가 끝날 때 삭제됩니다.
샘플
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ScopeSample { public static void main(String[] args) { int a = 10; if(a == 10) { int b = a; System.out.println(b); } System.out.println(b); } } |
위의 소스 코드를 작성해 보면 b 를 사용하는 곳이 두 개 있습니다.
if 안쪽 처리는 문제가 없지만 바깥쪽 처리는 컴파일 에러가 표시 되어 있습니다.
변수 b는 if의 괄호에 생성되고 괄호가 끝날 때 삭제됩니다.
if 밖에서는 이미 b가 없어진 후이기 때문에 b가 사용되면 컴파일 오류가 나타납니다.
샘플 2
1 2 3 4 5 6 7 8 9 10 11 |
public class ScopeSample { public static void main(String[] args) { int a = 10; if(a == 10) { int b = a; System.out.println(b); int a = 5; } } } |
상기의 샘플에는 if 안에 또 a를 선언하고 있습니다.
변수는 자신이 포함된 괄호보다 하위의 괄호에서도 사용할 수 있습니다.
그래서 if 안에 a를 또 선언을 하게 되면 상위의 변수 a와 충돌을 하게 됩니다.
샘플 3
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class ScopeSample { public static void main(String[] args) { int a = 10; System.out.println(c); } static void display() { int c; System.out.println(a); } } |
상기 샘플 변수 a와 c는 다른 메소드로 선언되어 있습니다.
즉, 포함되어 있는 괄호가 달라서 쓸 수가 없습니다.
클래스 필드의 유효 범위
클래스의 필드는 로컬 변수와 달라서 메서드 안에서 같은 이름의 변수가 선언되어 있어도 충돌이 일어나지 않습니다.
변수를 참조할 때 같은 이름의 로컬 변수가 존재하는 경우에는 로컬 변수 쪽이 참조되고
같은 이름의 로컬 변수가 존재하지 않을 경우에는 필드가 참조됩니다.
※필드 변수는 static 수식자가 부여되어 있지 않은 경우, static 메서드 안에는 참조할 수 없다.
샘플
1 2 3 4 5 6 7 8 |
public class ScopeSample { int a = 10; public void display() { int a = 5; System.out.println(a); } } |
상기 샘플의 클래스는 필드 변수 a와 display 메서드에서 선언한 로컬 변수 a를 가지고 있습니다.
2개의 a는 이름이 같지만 필드 변수와 로컬 변수이기 때문에 충돌하지 않습니다.
위의 샘플 클래스의 인스턴스를 생성하고 display 메서드를 실행하면
1 2 3 4 5 6 |
public class ExampleCalss { public static void main(String[] args) { ScopeSample scopeSample = new ScopeSample(); scopeSample.display(); } } |
로컬 변수 a의 값 5가 출력됩니다.
끝으로
이번 기사는 이상입니다.
다음 시간에는 자바의 접근통제를 배워보겠습니다.
방문해 주셔서 감사합니다.
コメント