이 중 첫번째를 제외한 나머지는 inner class 에 해당한다.
정적 멤버 클래스는 바깥 클래스의 private 멤버에 접근할 수 있다. 이 점만 제외한다면 나머지 일반 클래스와 똑같다.
정적 멤버 클래스와 비정적 멤버 클래스의 차이는 단순히 static 붙냐 안붙냐의 차이이지만, 의미상 차이는 꽤 크다.
정규화된 this ?
클래스명.this 형태로 바깥 클래스의 이름을 명시하는 용법
public class Outer {
    private final String name;
    public Outer(String name) {
        this.name = name;
    }
    public String getName() {
        return name;
    }
    class Inner {
        private final String InnerName;
        
        public Inner(String InnerName) {
            this.InnerName = InnerName;
        }
        public String getNameWithOuter() {
            return InnerName + Outer.this.getName();
        }
    }
    
   	static class Static{
    	private final String staticName;
    	public Static(String staticName) {
    		this.staticName = staticName;
    	}
    }
}
public class Test {
	
	public static void main(String[] args) {
		
		Outer outerClass = new Outer("hello");
        // Inner :: Outer 인스턴스가 있어야 생성 가능
		Outer.Inner innerClass = outerClass.new Inner("Inner");
        // Static :: Outer 인스턴스가 없어도 생성 가능
		Outer.Static staticClass = new Outer.Static("Static"); 
		
	}	
}
멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 정적 멤버 클래스로 만들자!