Foo.java

package innerclass;

public class Foo {

    class Bar{
        void say(){
            System.out.println("Foo-Bar");
        }
    }

    public void test(){
        new Bar().say();
    }
    
    public static void main(String[] args) {
        new Foo().test();
    }
    
}

Bar.java

package innerclass;

public class Bar {
   
    void say(){
        System.out.println("Bar");
    }

}

흠.. 저 상황에서 java Foo 를 실행하면 어떤 결과가 출력될까요? SCJP 문제 같네요.ㅋㅋ 답은 Foo-Bar 입니다. 자기 내부에 있는 클래스랑 같은 이름의 클래스가 같은 패키지 안에 있을 경우. 내부 클래스가 우선시 됩니다.

만약에 Foo.java 클래스가 덩치가 좀 커서 inner class인 Bar 클래스가 잘 안 보인다면, 밖에 있는 Bar 클래스의 객체라고 착각할 수도 있겠죠?

그래서 inner class의 객체를 만들 떄는 반드시 this.을 앞에 붙여주는게 좋겠습니다.

    public static void main(String[] args) {
        this.new Foo().test();
    }

요렇게 말이죠.