중첩 클래스
클래스 내부에 선언한 클래스, 사용하면 두 클래스의 멤버에 쉽게 접근 할 수 있고, 외부에 불필요한 관계 클래스 감춤으로써 코드의 복잡성 줄일 수 있음
ex) class a { class b { }} class a{ interface i { }}
- 멤버 클래스 : 클래스의 멤버로서 선언되는 중첩 클래스
ex) class a { class b{ }} - 인스턴스 멤버 클래스 : a 객체 생성해야만 사용할 수 있는 b 중첩 클래스
class a{ static class b { }} - 정적 멤버 클래스 : a 클래스로 바로 접근 할 수 있는 b 중첩 클래스
- 로컬 클래스 : 메소드내부에 선언되는 중첩 클래스
ex) class a{ void method(){ class b{ }}} : method()가 실행할 때만 사용할 수 있는 b 중첩 클래스
1. 인스턴스 멤버 클래스
static 키워드 없이 선언된 클래스. 인스턴스 필드와 메소드만 선언 가능하고 정적 필드와 메소드는 선언 불가
ex) A a = new A(); A.B b = a.new B();
2. 정적 멤버 클래스
static 키워드로 선언된 클래스. 모든 종류의 필드와 메소드 선언 가능
ex) A.c c = new A.C();
3. 로컬 클래스
중첩 클래스는 메소드 내에서도 선언 가능. 접근 지정자 + static 붙일 수 없음 -> 메소드 내부에서만 사용되므로 접근 제한 할 필요 없음
ex) void method(){ class D{...} D d = new D();} -> 메소드 실행 될 때, 메소드 내에서 객체 생성 후 사용
- 중첩 인터페이스
클래스 멤버로 선언된 인터페이스 -> why? 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서, 특히 UI 이벤트 처리 위해
ex) class a{ interface B {...}}
- 익명 객체
이름 없는 객체, 단독으로 생성 불가, 클래스 상속하거나 인터페이스를 구현해야만 상속 가능.
필드 초기값이나 로컬 변수의 초기값, 매개 변수의 매개값으로 주로 대입 -> UI 이벤트 처리 객체나 스레드 객체를 간편하게 생성할 목적으로 활용
ex) class A { Parent p = new Parent(){ ... // 필드 선언}}
-> 익명 자식 객체 내부에서만 사용되고 외부에서 접근 불가 why? 익명 자식 객체는 부모 타입 변수에 대입되므로 부모 타입에 선언된 것만 사용할 수 있기 때문
- 익명 구현 객체 생성
구현 클래스 재사용 되지 않고 오로지 해당 필드와 변수의 초기값으로 사용 하는 경우 익명 구현 객체를 초기값으로 대입하는 것이 좋다
ex) 인터페이스 [필드|변수] = new 인터페이스(){ //인터페이스에 선언된 추상 메소드와 실체 메소드 선언; }
-<이것이 자바다1>. 한빛미디어