중첩 클래스 Nested Class
- 클래스 내부에 선언한 클래스
- 두 클래스의 멤버들을 서로 쉽게 접근할 수 있다.
- 외부에는 불필요한 관계 클래스를 감춰서 코드의 복잡성을 줄일 수 있다.
1
2
3
4
5
class ClassName {
class NestedClassName {
// 중첩 클래스
}
}
클래스 내부에 선언되는 위치에 따라서 두가지로 분류
- 멤버 클래스 : 클래스 멤버로서 선언되는 중첩 클래스
- 클래스나 객체가 사용중이라면 언제든지 재사용이 가능
- 멤버 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
- 파일의 이름은
A $ B .class
(A: 바깥 클래스, B : 멤버클래스)- 인스턴스 멤버 클래스
1 2 3 4 5
classA { classB { ... } }
- 정적 멤버 클래스
1 2 3 4 5
classA { static classB { ... } }
- 인스턴스 멤버 클래스
- 로컬 클래스 : 메소드 내부에서 선언되는 중첩 클래스
- 메소드 실행시에만 사용되고, 메소드가 실행 종료되면 없어진다.
- 로컬 클래스도 하나의 클래스 -> 컴파일하면 바이트코드 파일(.class) 별도 생성
- 파일의 이름은
A $1 B .class
(A: 바깥 클래스, B : 로컬클래스)1 2 3 4 5 6 7
classA { void method() { class B { ... } } }
인스턴스 멤버 클래스
- static 키워드 없이 선언된 클래스
1 2 3 4 5 6 7
class A { class B { B() { } // 생성자 int field1; //인스턴스 필드 void method1() { }; // 인스턴스 메소드 } }
- 인스턴스 필드와 메소드만 선언이 가능하고 정적 필드와 메소드는 선언할 수 없다.
- 중첩 클래스 안에 static변수나 static 메소드를 만들 수 없다는 뜻.
- A클래스 외부에서 인스턴스 멤버 클래스 B의 객체를 생성하려면
- 먼저 A 객체를 생성한 후
- B 객체를 생성해야 한다.
1 2 3 4
A a = new A(); A.B b = a.new B(); b.field1 = 3; // 변수에 값을 할당함 b.method1(); // 메소드를 호출함
정적 멤버 클래스
- static 키워드로 선언된 클래스
1 2 3 4 5 6 7 8 9
class A { static class C { C() { } // 생성자 static int field1; //인스턴스 필드 static void method1() { }; // 인스턴스 메소드 int field2; //인스턴스 필드 void method2() { } // 인스턴스 메소드 } }
- 모든 종류의 필드와 메소드 선언 가능
- A클래스 외부에서 정적 멤버 클래스를 생성하기 위해서 A객체를 생성할 필요는 없다.
1 2 3 4 5
A.C c = new A.C(); c.field1 = 3; // 인스턴스 변수에 값을 할당함 c.method1(); // 인스턴스 메소드를 호출함 A.C.field2 = 3; // 정적 필드 사용 A.C.method2(); // 정적 메소드 호출
로컬 클래스
- 메소드 내에서도 선언할 수 있는 것을
local class
라 한다. - public, private, static을 붙일 수 없다. (메소드와 인스턴스 필드도)
- 로컬 클래스는 메소드 내부에서만 사용되기 때문에 접근을 제한할 필요가 없기 때문이다.
1 2 3 4 5 6 7 8 9 10 11
void method() { // 아래부터 로컬 클래스 class D { D() { } // 생성자 int field1; // 인스턴스 필드 void method; // } D d = new D(); d.field1 = 3; d.method1(); }
- 메소드가 실행될 때 메소드 내에서 객체를 생성하고 사용해야 한다.
- 주로 비동기 처리를 위해 스레드 객체를 만들 때 사용한다.
1 2 3 4 5
void method() { class DownloadThread extends Thread { ... } DownloadThread thread = new DownloadThread(); thread.start(); }
중첩 인터페이스
1
2
3
4
5
class ClassName {
interface NestedInterfaceName {
// 중첩 인터페이스
}
}
- 주로 UI프로그래밍에서 이벤트를 처리할 목적으로 많이 활용됨