questions - Modern-Java-in-Action/Online-Study GitHub Wiki
익명클래스와 this키워드 스코프 @박태영
public static class MeaningOfThis {
public final int value = 4;
public void doIt() {
int value = 6;
Runnable r = new Runnable() {
public final int value = 5;
@Override
public void run() {
int value = 10;
System.out.println(value);
System.out.println(this.value);
}
};
r.run();
}
}
10행에 run() 메서드 내부의 지역변수 value
를 출력하는 코드를 추가했습니다. 실행결과는 아래와 같습니다.
10
5
final
키워드를 사용해도 변수 쉐도잉은 일어나고 value
로는 메서드 내부 지역변수(9행)가 호출되어 10
을 출력합니다.
this.value
는 가장 가까운 스코프의 객체(Runnable
) 멤버 변수(4행)에 접근하여 5
를 출력한 것입니다.
추가로, 람다에서는 변수 쉐도잉이 일어나지 않는다고 합니다.
변수 쉐도잉: 마치 그림자를 드리우듯이, 스코프에 따라 상위 스코프의 멤버가 현재 스코프의 멤버에 의해 가려지는 것을 말함.
int x = 50;
public void foo(){
int x = 10;
System.out.println(x); //결과는 10
}