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 |