이 중 첫번째를 제외한 나머지는 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");
}
}
멤버 클래스에서 바깥 인스턴스에 접근할 일이 없다면 무조건 정적 멤버 클래스로 만들자!