내부 클래스는 말 그대로 클래스 내부에서 선언되는 클래스이다. 클래스 내부에 클래스를 선언하는 이유는 두 클래스가 밀접한 관계를 맺고 있기 때문이다. 두 클래스의 멤버간의 접근성을 용이하게 한다는 점과 외부에 불필요한 클래스를 감출수 있어 복잡성을 줄일수 있다는 점이 장점이다.
class A{ // 외부 클래스
...
class B { //내부 클래스
...
}
...
}
내부 클래스도 변수 선언과 같은 위치에서 선언되며, 선언 위치에 따라 내부 클래스의 종류가 구분된다.
인스턴스 클래스 : 외부 클래스 멤버변수 선언 위치에서 선언하며 인스턴스 멤버처럼 다룬다.
스태틱 클래스 : 외부 클래스 멤버변수 선언 위치에서 선언하며 static 멤버처럼 다룬다.
지역 클래스 : 메소드나 초기화블록 내부에서 선언하며 선언된 영역 내부에서만 사용가능하다.
익명 클래스 : 선언과 동시에 객체를 생성하는 이름이 없는 일회성 클래스이다.
class Outer_class{
class Instance_Innerclass{} //인스턴스 클래스
static class Static_Innerclass{} // 스태틱 클래스
void myMethod() {
class Local_Innerclass{} // 지역 클래스
}
}
각각의 클래스에서 선언할 수 있는 변수에는 제한이 있다. 먼저 인스턴스 클래스와 지역 클래스 내부에서는 인스턴스 변수나 final이 붙은 변수만 선언할 수 있다. 클래스 변수 내부에서는 인스턴스 변수, static 변수를 선언할 수 있다. 각각의 변수를 사용할 때도 조심해야 하는데, 인스턴스 클래스는 외부 클래스의 인스턴스 멤버를 객체 생성 없이 사용할 수 있지만, 스태틱 클래슨느 외부 클래스의 인스턴스 멤버를 객체 생성 없이 사용할 수 없다.
익명 클래스의 가장 특이한 점은 이름이 없다는 것이다. 클래스의 선언과 객체 생성을 동시에 진행하기 때문에 일회성으로 사용가능하고 하나의 객체만을 생성할 수 있다.