예제9 - 익명구현객체를 이용해 버튼 이벤트를 처리하는 방법 (p.413)
public class Button {
OnClickListener listener;
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
void touch() {
listener.onClick();
}
interface OnClickListener{
void onClick();
}
}
public class Window {
//필드 초기값으로 대입
//OnclickLister라는 중첩인터페이스 타입을 부르는 방법 : 외부클래스명.OnClickListener
//Window의 필드 listener에 익명구현클래스를 생성하고 참조를 집어넣는다.
Button.OnClickListener listener = new Button.OnClickListener() {
@Override
public void onClick() {
System.out.println("전화를 겁니다.");
}
};
//Button객체를 생성
Button button1 = new Button();
Button button2 = new Button();
Window(){
//button1(객체1)의 필드값으로 위에서 만들어준 익명구현객체1의 참조를 보낸다.
//즉 익명구현객체1은 Window 클래스에서 만들었지만 이 객체의 참조를 Button객체1의 매개값으로 넣어 Button객체1의 필드에 저장함으로써 다형성을 구현한다.
button1.setOnClickListener(listener);
//Window의 필드를 거치지 않고 바로 익명구현객체 생성하는 명령어를 매개값으로 넣는 방법이다.
button2.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick() {
System.out.println("메시지를 보냅니다.");
}
});
}
}
public class Main {
public static void main(String[] args) {
Window w = new Window();
w.button1.touch();
w.button2.touch();
}
}
6번 예제와의 차이점은
1. 구현클래스 대신 익명구현클래스를 사용하고 있다는점,
2. 메인클래스에서 Window 클래스를 따로 분리하여 구현객체를 생성하여 Button과 연결하는건 Window에서,
touch 메소드의 호출은 메인클래스에서 하고 있다는 점이다
예제6 - 중첩인터페이스의 활용 (p.402)
부품클래스
public class Button {
//2.인터페이스 타입 필드 선언
OnClickListener listener;
//3.Setter메소드 선언 : 인터페이스 타입 필드에 구현객체의 참조값을 넣어 다형성을 만들 메소드다.
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
//4.구현객체의 onClick()메소드 호출 : 외부에서 이 메소드를 호출함으로써,
구현객체별 onClick메소드 실행 결과를 다양화한다.
void touch() {
listener.onClick();
}
//이벤트를 처리하는 객체를 생성, 해당 객체의 사용법을 정하고 싶을 때 중첩인터페이스 사용
//1.중첩인터페이스 선언
interface OnClickListener{
void onClick();
}
}
구현클래스1
public class CallListener implements Button.OnClickListener{
//중첩인터페이스를 지정하기 위해 외부클래스명.중첩인터페이스명
@Override //오버라이딩 필요(실체메소드 선언)
public void onClick() {
System.out.println("전화를 겁니다.");
}
}
구현클래스2
public class MessageListener implements Button.OnClickListener{
@Override
public void onClick() {
System.out.println("메시지를 보냅니다.");
}
}
실행클래스
public class ButtonExample {
public static void main(String[] args) {
Button button = new Button();
button.setOnClickListener(new CallListener());
button.touch();
button.setOnClickListener(new MessageListener());
button.touch();
}
}
'Java > CodePractice' 카테고리의 다른 글
Ch12 확인문제 (0) | 2021.03.31 |
---|---|
Ch7 상속 문제(합,차,곱) (0) | 2021.03.14 |
Ch07 상속 - 다형성 (판매관리시스템) (0) | 2021.03.13 |
Ch7 - 다형성 TireEx (0) | 2021.03.11 |