Java 길찾기/이것이 자바다
[Java] 중첩 인터페이스
Kindbeeeear_
2022. 2. 9. 18:10
중첩 인터페이스는 클래스의 멤버로 선언된 인터페이스를 말한다. 인터페이스를 클래스 내부에 선언하는 이유는 해당 클래스와 긴밀한 관계를 맺는 구현 클래스를 만들기 위해서이다. 특히 UI 프로그래밍에서 이벤트를 처리할 목적으로 많이 활용된다.
class A {
interface I { // 중첩 인터페이스
void method();
}
}
예를 들어 Button을 클릭했을 때 이벤트를 처리하는 객체를 받고 싶다고 가정해보자. 그렇다고 아무 객체나 받으면 안 되고, Button 내부에 선언된 중첩 인터페이스를 구현한 객체만 받아야 한다면 다음과 같이 Button 클래스를 선언하면 된다.
// Button.java
public class Button {
OnClickListener listener; // 인터페이스 타입 필드
void setOnClickListener(OnClickListener listener) {
this.listener = listener;
}
void touch() {
listener.onClick();
}
interface OnClickListener { // 중첩 인터페이스
void onClick();
}
}
Button 클래스 내용을 보면 중첩 인터페이스(OnClickListener) 타입으로 필드(listener)를 선언하고 Setter 메소드(setOnClickListener())로 구현 객체를 받아 필드에 대입한다. 버튼 이벤트가 발생했을 때(touch() 메소드가 실행되었을 때) 인터페이스를 통해 구현 객체의 메소드를 호출(listener.onClick())한다. 다음은 Button 중심의 인터페이스인 OnClickListener를 구현한 두 개의 클래스를 보여준다.
// CallListener.java
public class CallListener implements Button.OnClickListener {
@Override
public void onClick() {
System.out.println("메세지를 보냅니다.");
}
}
// MessageListener.java
public class MessageListener implements Button.OnClickListener {
@Override
public void onClick() {
System.out.println("메세지를 보냅니다.");
}
}
다음은 버튼을 클랙했을 때 두 가지 방법으로 이벤트를 처리하는 방법을 보여준다. 어떤 구현 객체를 생성해서 Button 객체의 setOnClickListener() 메소드로 세팅하느냐에 따라서 Button의 touch() 메소드의 실행 결과가 달라진다.
// ButtonExample.java
public class ButtonExample {
public static void main(String[] args) {
Button btn = new Button();
btn.setOnClickListener(new CallListener());
btn.touch();
btn.setOnClickListener(new MessageListener());
btn.touch();
}
}