Java - 내부 클래스에서 동일 이름의 바깥 변수 접근

바깥 클래스의 인스턴스 변수 이름과,
내부 클래스의 인스턴스 변수 이름이 같은 경우 어떻게 되는가

Shdowing.class

public class Shdowing {
    public int value = 1;

    class Inner {
        public int value = 2;

        void go() {
            int value = 3;
            System.out.println("value is " + value);
            System.out.println("this value is " + this.value);
            System.out.println("class value is " + Shdowing.this.value);
        }
    }

    public static void main(String[] args) {
        Shdowing main = new Shdowing();
        Inner inner = main.new Inner();
        inner.go();
    }
}

value is 3
this value is 2
class value is 1

동일한 이름이 주어진 value 호출에는 코드블록으로부터 가장 가까운 것을 호출하는 것 디폴트이다.

또는 구체적인 정보가 있다면 우선권이 더 높다.

  • go() 메소드는 지역 변수 value 와 가까우므로 우선권이 높아 출력된다.
💡
지역변수 외의 가려져 안보이는 것을 영어로 Shadowing 이라한다.
블록 코드에 int value 있으므로 바깥의 public int value 변수들은 가려진다.

외부 변수가 Shadowing 되어도 인스턴스의 참조를 사용하면 외부 변수에 접근할 수 있따.

  • this.value
    • 내부 클래스의 인스턴스로 접근
  • 바깥클래스이름.this.value
    • 바깥 클래스의 인스턴스로 접근
💡
프로그래밍은 명확한게 좋다. 이름이 같아 헷갈리므로 명확하게 구분해서 지어주자.