int left; => 변수의 이름
public void sum(); => 메소드의 이름
프로그램이 커지면 이러한 이름들이 충돌하게 됨 (중복될 수도)
-> 해결 위해 유효범위(scope) 고안됨
유효범위
static void a() { 
int i = 0;    => 메소드 a 안에서 i 가 선언되므로 a 밖에선 영향 X (a 메소드 안에서만 유효함) => 유효범위
} 
public static void main(String[] args) { 
for (int i = 0; i < 5; i ++) { 
a(); 
System.out.println(i); 
}
//
0
1
2
3
4
전역변수, 지역변수
유효범위 비유- 디렉토리
파일 많아지면 관리 어려움 -> 디렉토리 내에서만 파일명 안 겹치게 하고, 밖에서는 중복되도 문제 없도록 함
public class ScopeDemo2 {
static int i;    => 클래스 바로 밑에서 선언되는 직속 변수 => 전역변수(global variables)
static void a() { 
i = 0;   => a 메소드 안에서 선언된 변수 => 지역변수(local variables)
}    => & int가 안 붙으므로 새로 생성 x, 앞의 전역변수 i 사용한 것 (일종의 the인듯)
public static void main(String[] args) { 
for (i = 0; i < 5; i ++) {    => 앞에 int가 없으므로 새로 i 선언한 것은 아님 => 이미 존재하던 전역변수 i 사용한 것
a(); 
System.out.println(i); 
}
//
0
0
0
...
public class ScopeDemo2 {
static int i; 
static void a() { 
int i = 0;    => i 변수 새로 생성, 세팅 -> 메소드 a 안에서만 유효
} 
public static void main(String[] args) { 
for (i = 0; i < 5; i ++) { 
a(); 
System.out.println(i); 
} 
}
//
0
1
2
3
4
public class ScopeDemo2 { 
static int i; 
static void a() { 
i = 0; 
} 
public static void main(String[] args) { 
for (int i = 0; i < 5; i ++) {    => for문 중괄호 안에서만 유효한 지역변수 i
a(); 
System.out.println(i); 
} 
}
//
0
1
2
3
4
다양한 유효범위
static void a() { 
String title = "coding everbody"; 
} 
public static void main(String[] args) { 
a(); System.out.println(title);   => 따로 title에 대한 선언이 존재하지 않음 -> a 안의 title 읽지 못함
}
public static void main(String[] args) { 
for (int i = 0; i < 5; i++) { 
System.out.println(i);} System.out.println(i);   => for문 중괄호 밖에는 선언된 i 가 없으므로 출력 X, 새로 생성시켜야 함
} 
}
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(); 
}
//5
static int i = 5; 
static void a() { 
int i = 10; 
b(); 
} 
static void b() { 
System.out.println(i); 
} 
public static void main(String[] args) { 
int i = 1; 
a(); 
}
//5
static int i = 5; 
static void a() { 
int i = 10; 
b(); 
} 
static void b() { 
int i = 30; 
System.out.println(i);    => 메소드 b의 유효범위 사용
} 
public static void main(String[] args) { 
int i = 1; 
a(); 
}
//30
- 정적인 유효범위(static/lexical scope) : 고정된 형태의 유효범위 - 자기 자신 또는 전역변수에만 접근 가능 = 메소드끼리 링크되지 않는 것? )
( <-> b 호출했는데 a 메소드 지역변수가 출력 : 동적인 유효범위(dynamic scope) )
static void a() { 
int i = 10; 
b(); 
} 
static void b() {    => 선언된 i 가 없음System.out.println(i); 
} 
public static void main(String[] args) { 
int i = 1; 
a(); 
}
this
class C { 
int v = 10;   => 전체적으로는 10 / m 메소드라는 특수 상황에서만 20 출력
void m() { 
int v = 20;    => 선언된 변수 중복 -> 해당 메소드 안 지역변수가 1순위 
System.out.println(v); 
} 
} 
public class ScopeDemo6 { 
public static void main(String[] args) { 
C c1 = new C(); 
c1.m(); 
}
}
//20
- this
class C { 
int v = 10; 
void m() { 
int v = 20; 
System.out.println(v); 
System.out.println(this.v);    => 인스턴스 그 자체 & 그 객체에 대한 전역
} 
} 
public class ScopeDemo6 { 
public static void main(String[] args) { 
C c1 = new C(); 
c1.m(); 
}
//
20
10
총정리
유효범위 = 전역변수, 지역변수로 나눠 관리하기 편리하도록 한 것
'Programming > 자바' 카테고리의 다른 글
| 생활코딩 자바 - 상속 (0) | 2022.04.02 | 
|---|---|
| 생활코딩 자바 - 생성자 (0) | 2022.04.02 | 
| 생활코딩 자바 - 클래스 멤버, 인스턴스 멤버 (0) | 2022.03.28 | 
| 생활코딩 자바 - 클래스, 인스턴스, 객체 (0) | 2022.03.25 | 
| 생활코딩 자바 - 객체지향 프로그래밍 (0) | 2022.03.25 |