자바
[자바] 유효범위
j9972
2022. 8. 4. 11:44
728x90
유효범위
프로그램이 커지면서 여러가지 이유로 이름이 출돌하는데, 이를 해결하기 위해 유효범위가 생김
유효범위를 보이는 코드
public class ScopeDemo {
static void a() {
int i = 0; // 지역변수
}
public static void main(String[] args) {
for(int i = 0; i < 5; i++) {
a();
System.out.println(i);
}
}
}
유효범위를 이해하기 위해서는 디렉토리를 생각을 하면 된다.
변수의 유효범위를 통해 for문에 영향을 끼치는 예시 코드 ( 무한 루프 예제 )
public class ScopeDemo1 {
static int i; // 전역 변수
static void a() {
i = 0;
}
public static void main(String[] args) {
for(i = 0; i < 5; i++) { // for문 안에 int를 생략했다는 점이 다르다
a();
System.out.println(i);
}
}
}
// 무한 루프를 일으키지 않는 방법은 기존에 지역변수를 쓰는 방식 or 아래 코드
public class ScopeDemo1 {
static int i; // 전역 변수
static void a() {
// 이 부분
int i = 0;
}
public static void main(String[] args) {
// 이 부분
for(int i = 0; i < 5; i++) {
a();
System.out.println(i);
}
}
}
// 지역변수로 전언을 하던가 or for문 안에 int를 넣는 방법이 있다
다양한 유효범위
public class ScopeDemo2 {
static int i = 5;
static void a() { // 1 - 1
int i = 10; // a 메소드의 지역변수로 사용이 되지 않는다.
b(); // 2번
}
static void b() { // 2번
// int i = 30; 이렇게 있다면 지역변수 30을 사용해서 30이 호출된다.
System.out.println(i); // 전역변수 5를 사용한다.
// 만약 전역변수가 없다면 i는 호출되지 않는다.
}
public static void main(String[] args) {
a(); // 1번
}
}
// 5를 호출한다 ( 전역변수를 사용한다는 것이다. )
- 결국 정적인 유효범위는 b안에서 결과를 print하므로 b안의 지역변수 혹은 전역변수를 생각하면 된다.
this
class C {
int v = 10;
void m() {
// int v = 20; 이라는 지역변수가 있다면 지역변수의 우선순위가 전역보다 높으니 20이 출력된다
// 없다면, v = 10이 출력된다.
System.out.println(v); // 지역변수 20 출력
System.out.println(this.v); // 전역 변수 10이 출력
// this가 있으면, 전역의 의미를 갖는다.
}
}
public class ScopeDemo {
public static void main(String[] args) {
C c1 = new C();
c.m();
}
}
this의 또 다른 예시
class C {
int left, right;
public void setOperand(int left, int right) {
this.left = left; // 인자로 받는 값을 전역변수의 값에(this) 대입을 하여 사용한다는 의미
this.right = right;
}
/*
public void setOperand(int _left, int _right) {
left = _left;
right = _right;
}
this를 쓰기전 변수의 이름이 겹치지 않는다면, this를 쓰지 않아도 이름이 겹치지 않기에 this와 같은 역할이 가능하다
*/
}
- 지역변수가 우선순위가 전역변수보다 우선순위가 높다는 말은 값이 조금 더 구체적일수록 우선순위가 높다.
- this가 있으면, 전역의 의미를 갖는다. ( this가 붙으면 전역변수를 의미한다. )