본문 바로가기

Java/CodePractice

Ch9 중첩클래스와 중첩 인터페이스

예제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' 카테고리의 다른 글