내부클래스는 주로 AWT나 SWING같은 GUI어플리케이션의 이벤트처리에 주로 사용된다.
클래스 내부에 선언된 클래스이다. 클래스에 다른 클래스를 선언하는 이유는 두 클래스가 서로 긴밀한 관계에 있기 때문이다.
내부클래스를 사용하게 되면 두 클래스의 멤버들 간에 서로 쉽게 접근할 수 있다. 또 외부에는 불필요한 클래스를 감춤으로써 코드의 복잡성을 줄일 수 있다.
내부클래스는 다른클래스에서는 잘 사용되지 않은
내부 클래스의 종류는 변수의 선언위치에 따른 종류와 같다. 변수를 선언할 때 인스턴스 변수, 클래스 변수(static), 지역변수로 구분되는 듯이 내부클래스도 위치에 따라 구분된다.
class Outer{
class InstanceInner{}
static class StaticInner{}
void myMethod(){
class LocalInner{}
}
}
각 내부클래스의 선언위치에 따라 같은 선언위치의 변수와 동일한 유효범위, 접근성을 갖는다.
내부클래스 중 인스턴스 클래스와 스태틱 클래스는 외부클래스의 멤버변수와 같은 위치에 선언되며, 멤버변수와 같은 성질을 갖는다. 멤버와 같은 규칙이 적용된다.
내부클래스도 abstract
, final
같은 제어자를 사용할 수 있고, private
, protected
와 같은 접근제어자 사용이 가능하다.
내부클래스 중 스태틱 클래스만 static멤버를 가질 수 있다. 하지만 다른 클래스에서도 상수(final static
)는 정의가능하다.
public class InnerEx1 {
class InstanceInner{
int iv = 100;
//static int cv = 100;
final static int CONST = 100;
}
static class StaticInner{
int iv = 200;
static int cv = 200;
}
void myMethod(){
class LocalInner{
int iv = 300;
//static int cv = 300;
final static int CONST = 300;
}
}
public static void main(String[] args) {
System.out.println(InstanceInner.CONST);
System.out.println(StaticInner.cv);
}
}