class A {
...
}
class B {
... // A의 객체를 생성해야 접근 가능
}
class A { // B의 외부 클래스
...
class B { // A의 내부 클래스
...
} // 객체 생성 없이도 A의 멤버 접근 가능
...
}
class Outer {
int iv = 0; // 1) iv
static int cv = 0; // 2) cv
void myMethod() {
int lv = 0; // 3) lv
}
}
class Outer {
class InstanceInner {} // 1)
static class StaticInner {} // 2)
void myMethod() {
class LocalInner {} // 3)
}
}
내부 클래스 | 특징 |
---|---|
인스턴스 내부 클래스 (instance inner class) | 외부 클래스의 멤버 변수 선언 위치에 선언하며, 외부 클래스의 인스턴스 멤버처럼 다루어진다. 주로 외부 클래스의 인스턴스 멤버들과 관련된 작업에 사용될 목적으로 선언된다. |
스태틱 내부 클래스 (static inner class) | 외부 클래스의 멤버 변수 선언 위치에 선언하며, 외부 클래스의 static 멤버 처럼 다루어진다. 주로 외부 클래스의 static 멤버, 특히 static 메서드에서 사용될 목적으로 선언된다. |
지역 내부 클래스 (local inner class) | 외부 클래스의 메서드나 초기화 블럭 안에 선언하며, 선언된 영역 내부에서만 사용될 수 있다. |
익명 클래스 (anonymous class) | 클래스의 선언과 객체의 생성을 동시에 하는 이름 없는 클래스 (일회용, 이벤트 처리) |
public
, (default)
, protected
, private
) class Outer {
private int iv = 0; // 1) iv
protected static int cv = 0; // 2) cv
void myMethod() {
int lv = 0; // 3) lv
}
}
class Outer {
private class InstanceInner {} // 1)
protected static class StaticInner {} // 2)
void myMethod() {
class LocalInner {} // 3)
}
}
private
멤버도 접근 가능final
이 붙은 상수만 접근 가능inner_class_name.variable
로 접근 가능 (지역 내부 클래스 제외)Outer o = new Outer();
Outer.InstanceInner ii = o.new InstanceInner();
final
static
상수는 예외)Outer.StaticInner si = new Outer.StaticInner();
static
상수 포함)Outer$InstanceInner.class
Outer$StaticInner.class
Outer$1LocalInner.class
// 익명은 자신의 이름이 없음
class ~~MyClass~~ extends Object // 클래스 정의
{}
~~MyClass mc =~~ new ~~MyClass~~(); // 클래스 생성
//-----> 정의와 생성을 한번에
new Object() {} // 조상 클래스 이름
new Inter() {} // 구현 인터페이스 이름
Object obj = new Object() {}
Outer$1.class
Outer$2.class