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
}