개요

class MyClass {
    class InnerClass{}

    static class InnerStaticClass{} // 내부 클래스에 static이 붙는다면?
}

inner class

// 서로 다른 참조
MyClass.InnerClass mic1 = new MyClass().new InnerClass();
MyClass.InnerClass mic2 = new MyClass().new InnerClass(); 

inner static class

// 서로 다른 참조
MyClass.InnerStaticClass misc1 = new MyClass.InnerStaticClass();
MyClass.InnerStaticClass misc2 = new MyClass.InnerStaticClass();

숨은 외부 참조

MyClass mc = new MyClass();
MyClass.InnerClass mic3 = mc.new InnerClass(); // Myclass에 대한 숨은 외부 참조를 가진다.

MyClass.InnerStaticClass misc3 = new MyClass.InnerStaticClass(); // 외부 참조 없음
class MyClass {
    void myMethod() {
        ...
    }

    class InnerClass{
        void innerClassMethod() {
            MyClass.this.myMethod(); // 숨은 외부 참조가 있기 때문에 가능
        }
    }

    static class InnerStaticClass{
        void innerClassMethod() {
            MyClass.this.myMethod(); // 컴파일 에러
        }
    }
}