클래스 내에 선언된 클래스, 외부 클래스와 내부 클래스가 서로 연관되어 있을 때 사용
내부 클래스는 외부 클래스의 멤버들을 쉽게 접근 할 수 있고, 코드의 복잡성을 줄일 수 있다.
내부 클래스는 외부 클래스 내에 선언되는 점을 제외하면 일반적인 클래스와 차이점이 없다.
선언하는 위치나 예약어에 따라 크게 4가지 유형으로 분류가 가능
class OuterClass{
private int instanceNum = 1;
static private int staticNum = 2;
void instanceMethod() {
System.out.println("인스턴스 메서드");
}
static void staticMethod(){
System.out.println("스태틱 메서드");
}
class InstanceInnerClass{
int inNum = 10;
void Test(){
System.out.println(instanceNum + staticNum);
instanceMethod();
staticMethod();
}
}
static class StaticInnerClass{
int inNum = 10;
void Test(){
System.out.println(staticNum);
staticMethod();
// instanceNum, instanceMethod() 사용불가
}
}
}
class OuterClass2{
private int instanceNum = 1;
void outerMethod() {
int localNum = 10;
class LocalInnerClass{
void test() {System.out.println("지역 내부 클래스 안 메서드");}
// static void test2() {System.out.println("지역 내부 클래스 안 메서드는 static 불가!");}
}
LocalInnerClass localInnerClass = new LocalInnerClass();
localInnerClass.test();
}
}
interface InterfaceExample {
int CONSTANT = 3;
default void printTest() {};
}
public class InnerClassTest {
public static void main(String[] args) {
InterfaceExample anonymousClass = new InterfaceExample() {
public void printTest() {
System.out.println("익명 내부 클래스");
}
};
anonymousClass.printTest(); // 익명 내부 클래스
}
}