[목차]
- 유효범위란?
- 전역변수, 지역변수
- this
유효범위란
- 변수와 메소드 같은 것들을 사용할 수 있는 것은 이름이 있기 떄문입니다.
- left는 변수의 이름이고, sum은 메소드 이름입니다.
- 프로그램이 커지면 여러 이유로 충돌하기 되는데 이를 해결하기 위해 만들어진 것이 유효범위라는 개념입니다.
이 개념을 스코프라고 부릅니다.
int left;
public void sum() {}
public class ScopeDemo {
// a라는 메소드를 호출할 때 마다 i의 값이 0으로 세팅됨
// a라는 메소드 안에서 변수를 선언하게 되면 그 변수는 메소드 안에서만 사용할 수 있는 변수가 됩니다.
// 그러한 범위를 유효범위라고 합니다.
static void a() {
// int i = 0; 이라는 변수는 a라는 메소드 안에 선언되어 있기 때문에
// int i = 0; 이라는 변수는 a메소드 밖에서는 영향을 미치지 않습니다.
int i = 0;
}
public static void main(String[] args) {
// i가 0부터 5보다 작을 떄까지 반복합니다.
for (int i = 0; i < 5; i++) {
// 0으로 초기화
a();
// 0 1 2 3 4가 세로로 출력됩니다.
System.out.println(i);
}
}
}
전역변수, 지역변수
// 변수 i가 메소드 a에 소속된 변수라는 의미입니다.
// 이 변수의 값을 어떻게 바꿔도 이 변수의 밖에는 영향을 주지 않습니다.
// 지역변수
static void a() {
int i = 5;
}
public class ScopeDemo 2 {
// 어디에 속해있는 변수가 아닌 class에 속해 있는 변수를 전역변수 라고 합니다.
// i라고 하는 변수를 메소드 밖에 for문 밖에 class 영역에 선언해 줬습니다.
/*
전역 변수 i라는 값과는 전혀 무관한 값이 됨
*/
static int i;
static void a() {
/*
int i = 0; 이라고 하면 결과값 0 1 2 3 4를 세로로 출력함
이유: i의 값을 0 이라고 바꾸고 있는데 i의 데이터 타입을 int 라고 지정 했을 때
int i = 0은 a메소드 안에서만 사용할 수 있게 되기 i를 사용하려고 했던 메모리가 삭제 됩니다.
*/
// 이 i의 값은 전역변수의 i를 사용하고 있습니다.
i = 0;
}
public static void main(String[] args) {
// for문도 i의 값을 선언하지 않고 할당만 했습니다.
for (i = 0; i < 5; i++) {
// i가 1이 되고 a라는 메소드를 호출해서 i의 값이 0이 됩니다.
a();
// 결과값: 0이 무한반복
System.out.println(i);
}
}
}
this
- 인스턴스 자신을 의미하는 것을 this라고 합니다.
ex) 인스턴스 C c1 = new C(); 인스턴스를 의미하기 때문에 10 출력
- this 가 붙게 되면 그 객체에 대한 전역의 의미를 갖게 됩니다.
class C {
int v = 10;
void m() {
// 지역변수가 우선순위가 더 높기 때문에 20이 출력됩니다.
int v = 20;
System.out.println(v);
}
}
public class ScopeDemo7 {
public static void main(String[] args) {
// C라고 하는 클래스를 c1이라는 인스턴스에 담습니다.
C c1 = new C();
c1.m();
}
}
class C {
int v = 10;
void m() {
// 지역변수가 우선순위가 더 높기 때문에 20이 출력됩니다.
int v = 20;
// 지역변수 20을 출력
System.out.println(v);
// 전역변수 10을 출력
System.out.println(this.v);
}
}
public class ScopeDemo7 {
public static void main(String[] args) {
// C라고 하는 클래스를 c1이라는 인스턴스에 담습니다.
C c1 = new C();
c1.m();
}
}