'내부 클래스' 란 말 그대로 클래스 안에 있는 클래스이다.
멤버에 대한 접근 권한은 스코프랑 똑같이 생각하면 되고, 구체적으로 아래와 같다.
일반적인 형태의 내부 클래스이다.
class Outer {
static int num;
public void print() {
System.out.println("Outer class");
}
class Inner {
public void print() {
Outer.this.print();
System.out.println("Inner Class");
}
}
}
public class Test {
public static void main(String[] args) throws IOException {
/* 인스턴스 클래스 */
Outer.Inner innerClass = new Outer().new Inner();
innerClass.print();
}
}
내부 클래스에 static 키워드를 적용해 바깥클래스의 객체가 생성되지 않아도 메모리에 상주해 미리 사용가능하다.
class Outer {
static int num;
public void print() {
System.out.println("Outer class");
}
static class InnerStatic {
void print() {
// Outer.this.num = 1; => error
// Outer.this.print(); => error
// InnerStatic 은 static 이라서 바로 메모리에 올라간다.
// 하지만 클래스 Outer 는 static 이 아니라 객체가 생성되기 전까지는 메모리에 올라가지 못한다.
// 따라서 외부클래스의 멤버로 접근이 불가하다.
// Outer.this 객체로의 접근 자체가 막혀있다.
System.out.println("Inner Static Class not static print()");
}
static void staticPrint() {
System.out.println("Inner Static Class static print()");
}
}
}
public class Test {
public static void main(String[] args) throws IOException {
/* 정적 클래스 */
Outer.InnerStatic.staticPrint();
Outer.InnerStatic innerStatic = new Outer.InnerStatic();
innerStatic.print();
}
}
이름이 없는 클래스로 선언과 동시에 객체를 생성하는 일회용 클래스이다.
abstract class AbstractClass {
public void print1(){
System.out.println("not abstract print");
}
abstract public void print2();
}
public class Test {
public static void main(String[] args) throws IOException {
/* 익명 클래스 -> AbstractClass 클래스의 인스턴스가 아니다. */
AbstractClass abstractClass = new AbstractClass() {
@Override
public void print2() {
System.out.println("abstract print");
}
};
abstractClass.print1();
abstractClass.print2();
}
}
클래스 내의 메서드 안에 있는 클래스이다.