지금까지는 클래스 중심으로 유효범위를 알아봤다. 인스턴스에서의 유효범위도 클래스와 거의 동일하지만 결정적인 차이점은 this에 있다고 할 수 있다. 아래 예제를 보자.
package org.opentutorials.javatutorials.scope;
class C {
int v = 10;
void m() {
System.out.println(v);
}
}
public class ScopeDemo7 {
public static void main(String[] args) {
C c1 = new C();
c1.m();
}
}
결과는 10이다.
아래와 같이 코드를 변경해보자.
package org.opentutorials.javatutorials.scope;
class C2 {
int v = 10;
void m() {
int v = 20;
System.out.println(v);
}
}
public class ScopeDemo8 {
public static void main(String[] args) {
C2 c1 = new C2();
c1.m();
}
}
7행이 추가되었다. 결과는 20이다. 즉 메소드 안에서 선언된 변수 v가 지역 변수가 되면서 인스턴스 전역에서 유효한 인스턴스 변수 v의 값보다 우선순위가 높아지면서 20이 출력된 것이다.
이런 상황에서 메소드 m에서 인스턴스 변수 v에 접근하려면 어떻게 해야할까? this를 사용하면 된다. 아래 코드를 보자.
package org.opentutorials.javatutorials.scope;
class C3 {
int v = 10;
void m() {
int v = 20;
System.out.println(this.v);
}
}
public class ScopeDemo9 {
public static void main(String[] args) {
C3 c1 = new C3();
c1.m();
}
}
7행이 this.v로 바뀌었다. 그 결과 메소드 m 안에서 인스턴스 변수 v를 사용할 수 있게 되었다. this는 인스턴스 자신을 의미하는 키워드라고 할 수 있다.