내부 클래스의 제어자는 변수에 사용 가능한 제어자와 동일
(일반 클래스는 제어자로 default와 public만 되는 반면 내부 클래스는 전체 제어자 사용 가능)
static 멤버(cv)를 가지기 위한 내부 클래스는 당연히 static class 이어야 한다.
(why? cv는 객체생성 없이 사용 가능해야한다. 만약 내부 클래스가 static이 아니면 객체를 생성해야 사용 가능. -> 모순 발생)
(But, 상수(final static)의 경우 다른 내부 클래스에서도 허용)
객체 iv(인스턴스 멤버)가 cv(static 멤버)를 쓸 수 있지만, cv가 iv를 쓸 수 없으므로 static 내부 클래스에서는 외부 클래스의 인스턴스 멤버에 접근할 수 없다.
내부 클래스에서는 외부 클래스의 private 멤버도 접근 가능하다.
지역 내부 클래스(클래스 안의 메서드 안의 클래스)에서는 상수만 접근 가능
(why? 지역 변수는 메서드 종료와 함께 소멸. 지역 변수(lv)보다 내부 클래스의 객체가 더 오래 존재 가능하기 때문. 상수는 constant pool에서 따로 관리한다.)
new 조상클래스이름(){
// 멤버 선언 (클래스 내용)
}
또는
new 구현인터페이스이름(){
// 멤버 선언 (클래스 내용)
}
class Ex{
Object iv = new Object(){ void method(){} }; // 익명 클래스
static Object cv = new Object(){ void method(){} }; // 익명 클래스
void myMethod() {
Object lv = new Object(){ void method(){} }; // 익명 클래스
}
}