Java 내부 클래스는 4가지 유형으로 구분됩니다.
1) 정적 내부 클래스: 정적 클래스를 클래스 내부에 넣는 것을 정적 클래스라고 합니다.
특징: 외부 세계에 접근 가능: 정적 메서드/정적 속성, 인스턴스 리소스에 접근 불가
사례:
import inner.Foo.Koo;//반드시 import the Koo 정적 내부 클래스
public class Demo9 {
public static void main(String[] args) {
Koo koo = new Koo();
koo.add ();
}
}
class Foo{
int a = 12;//인스턴스 변수
static int aa =16;
public static void show(){ System.out.println("static method");}
//static 내부 클래스
static class Koo {
public void add(){
// System.out.println(a) 정적 내부 클래스는 인스턴스 리소스(변수)에 액세스할 수 없습니다.
System .out.println(aa);
show();//정적 내부 클래스는 외부 세계의 정적 속성과 메서드에 액세스할 수 있습니다
}
}
}
2) 멤버 내부 클래스: 클래스 내부에는 정적 수정 없이 클래스를 직접 정의합니다. 멤버 내부 클래스 객체 생성 시 외부 클래스를 먼저 생성해야 합니다.
특징: 멤버 내부 클래스, 외부 속성 및 메소드에 접근 가능
사례:
import inner.Foo1.Koo1;
public class Demo10 {
public static void main(String[] args) {
//Koo1 koo1 = new Koo1(); 멤버 내부 클래스를 생성하려면 먼저 외부 클래스 객체를 생성해야 합니다
Foo1 foo1 = new Foo1();
//기억하기(필기시험)
Koo1 koo1 = foo1.new Koo1();
koo1.show( );
}
}
class Foo1{
int a =12;
static int aa = 16;
class Koo1{
void show(){
System.out.println(a+" , "+aa);
}
}
}
3) 부분 내부 클래스: 거의 사용되지 않음, 메소드 내에서 클래스를 정의하는 것이 특징(엔터프라이즈 개발에서는 거의 사용되지 않음)
특징: 로컬 내부용 클래스, 외부 변수를 참조할 때 변수는 final
으로 수정해야 합니다. 사례:
public class Demo11 {
public static void main(String[ ] args) {
final int a = 12;
final int b = 13;
class Foo2{
int c = 16;
public int add(){
//로컬 내부 클래스에서 외부 변수가 참조되는 경우 해당 변수는 final
return a+b+c;
}}Foo2 foo2 = new Foo2();System.out.println(foo2.add());} }4) 익명 내부 클래스: 원래 클래스의 상속특징: 인터페이스/추상 클래스와 조합하여 사용예: 새 클래스 이름/인터페이스 이름 {재정의 방법};케이스: