
⏩ 중첩 클래스(Nested Class) : 클래스 내부에 선언한 클래스
멤버 클래스 : 클래스의 멤버로서 선언됨
(1) 인스턴스 멤버 클래스 : A 객체를 생성해야 B 객체 생성 가능
class A{
class B{}
}
(2) 정적 멤버 클래스 : A객체를 생성하지 않아도 B 객체 생성 가능
class A{
static class B{}
}
로컬 클래스 : 메소드 내부에서 선언됨
class A{
void method(){
class B{}
}
}
| 구분 | 접근 범위 |
|---|---|
| public class B{ } | 다른 패키지에서 B 클래스를 사용 |
| class B { } | 같은 패키지에서만 B 클래스를 사용 |
| private class B { } | A 클래스 내부에서만 B 클래스 사용 |
public class A{
//인스턴스 멤버 클래스
class B {}
//인스턴스 필드 값으로 B 객체 대입
B field = new B();
//생성자
A(){
B b = new B();
}
//인스턴스 메소드
void method(){
B b = new B();
}
}
//main
A a = new A(); // A 객체 생성
A.B b = a.new B(); // B 객체 생성
| 구분 | 접근 범위 |
|---|---|
| public static class B { } | 다른 패키지에서 B 클래스 사용 |
| static class B { } | 같은 패키지에서만 B 클래스 사용 |
| private static class B { } | A 클래스 내부에서만 B 클래스 사용 |
public class A{
// 인스턴스 멤버 클래스
static class B {}
// 인스턴스 필드 값으로 B 객체 대입
B field1 = new B();
// 정적 필드 값으로 B 객체 대입
static B field2 = new B();
// 생성자
A(){
B b = new B();
}
// 인스턴스 메소드
void method1(){
B b = new B();
}
// 정적 메소드
static void method2(){
B b = new B();
}
}
//main
A.B b = new a.B(); // B 객체 생성
b.method1(); //b소속의 메소드가 있다면 이런 방식으로 사용
public class A{
//생성자
A(){
//로컬 클래스 선언
class B{}
//로컬 객체 생성
B b = new B();
}
//메소드
void method(){
//로컬 클래스 선언
class B{}
}
}
| 구분 | 바깥 클래스의 사용 가능한 멤버 |
|---|---|
| 인스턴스 멤버 클래스 | 바깥 클래스의 모든 필드와 메소드 |
| 정적 멤버 클래스 | 바깥 클래스의 정적 필드와 정적 메소드 |
public class A{
//A의 인스턴스 필드와 메소드
int field1;
void method1(){}
//A의 정적 필드와 메소드
static int field2();
static void method2() {}
//인스턴스 멤버 클래스
class B{
void method(){
//A의 인스턴스 필드와 메소드 사용
field1 = 10;
method1();
//A의 정적 필드와 메소드 사용
field2 = 10;
method2();
}
}
//정적 멤버 클래스
static class C{
void method(){
//A의 인스턴스 필드, 메소드 사용 불가
//A의 정적 필드와 메소드 사용
field2 = 10;
method2();
}
}
}
//바깥 클래스 이름.this -> 바깥 객체를 가리킴
public class A{
...
class B{
this.method(); // B객체의 필드와 메소드 사용(B 자신의 것을 접근할 때)
A.this.method(); // A객체의 필드와 메소드 사용
}
}
class A{
[public | private] [static] interface B{
// 상수필드
// 추상 메소드
// 디폴트 메소드
// 정적 메소드
}
}
public class Button{
//정적 멤버 인터페이스
public static interface ClickListener{
//추상 메소드
void onClick();
}
//필드
private ClickListener clickListener;
//메소드
public void setClickListener(ClickListener clickListener){
this.clickListener = clickListener;
}
public void click(){
this.clickListener.onClick();
}
}
public class ButtonExample{
public static void main(String[] args){
//OK 버튼 객체 생성
Button btnOK = new Button();
//OK 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스(로컬 클래스)
class OkListener implements Button.ClickListener{
@Override
public void onClick(){
System.out.println("Ok버튼을 클릭함");
}
}
//Ok 버튼 객체에 ClickListener 구현 객체 넣기
btnOk.setClickListener(new OkListener());
//Ok 버튼 클릭
btnOk.click();
///////////////////////////////////////
//Cancel 버튼 객체 생성
Button btnCancel = new Button();
//Cancel 버튼 클릭 이벤트를 처리할 ClickListener 구현 클래스(로컬 클래스)
class CancelListener implements Button.ClickListener{
@Override
public void onClick(){
System.out.println("Cancel 버튼 클릭");
}
}
//Cancel 버튼 객체에 ClickListener 구현 객체 넣기
btnCancel.setClickListener(new CancelListener());
//Cancel 버튼 클릭
btnCancel.click();
}
}
//필드에 익명 자식 객체 대입
private Tire tire2 = new Tire(){
@Override
public void roll(){
System.out.println("익명 자식 Tire 객체1이 굴러간다");
};
};
//메소드(로컬변수이용)
public void run2(){
//로컬 변수에 익명 자식 객체 대입
Tire tire = new Tire(){
@Override
public void roll(){
System.out.println("익명 자식 Tire 객체2가 굴러간다");
}
};
tire.roll();
}
public interface RemoteControl{
//추상 메소드
void turnOn();
void turnOff();
}
public class Home{
//필드에 익명 구현 객체 대입
private RemoteControl rc = new RemoteControl(){
@Override
public void turnOn(){
System.out.println("TV를 켭니다");
}
}
}
이것이 자바다(신용권, 임경균 지음)