Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java 이벤트 리스너 인터페이스와 이벤트 어댑터 클래스의 차이점 완벽 정리

EventListener(이벤트 리스너) 인터페이스는 특정 종류의 이벤트를 처리하기 위해 이벤트 핸들러가 반드시 구현해야 하는 메서드들을 정의하는 반면, Event Adapter(이벤트 어댑터) 클래스는 해당 EventListener 인터페이스에 대한 기본 구현(default implementation)을 미리 제공하는 클래스입니다.

이벤트 리스너(Event Listener)란?

  • 이벤트 리스너는 모든 컴포넌트가 이벤트를 처리할 수 있도록 뒷받침하는 핵심 요소입니다.
  • 특정 EventListener 인터페이스의 모든 메서드는 EventObject 클래스의 하위 클래스 인스턴스를 단일 매개변수로 가집니다.
  • EventListener 인터페이스는 확장(구현)하여 사용해야 하며, java.util 패키지에 정의되어 있습니다.
  • 대표적인 EventListener 인터페이스로는 ActionListener, KeyListener, MouseListener, FocusListener, ItemListener 등이 있습니다.

EventListener 예제

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyListenerTest implements KeyListener, ActionListener {
    JFrame frame;
    JTextField tf;
    JLabel lbl;
    JButton btn;
    public KeyListenerTest() {
        frame = new JFrame();
        lbl = new JLabel();
        tf = new JTextField(15);
        tf.addKeyListener(this);
        btn = new JButton("Clear");
        btn.addActionListener(this);
        JPanel panel = new JPanel();
        panel.add(tf);
        panel.add(btn);
        frame.setLayout(new BorderLayout());
        frame.add(lbl, BorderLayout.NORTH);
        frame.add(panel, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setSize(300, 200);
        frame.setVisible(true);
    }
    @Override
    public void keyTyped(KeyEvent ke) {
        lbl.setText("You have typed "+ ke.getKeyChar());
    }
    @Override
    public void keyPressed(KeyEvent ke) {
        lbl.setText("You have pressed "+ ke.getKeyChar());
    }
    @Override
    public void keyReleased(KeyEvent ke) {
        lbl.setText("You have released "+ ke.getKeyChar());
    }
    @Override
    public void actionPerformed(ActionEvent ae) {
        tf.setText("");
    }
    public static void main(String args[]) {
        new KeyListenerTest();
    }
}

실행 결과

Java 이벤트 리스너 인터페이스와 이벤트 어댑터 클래스의 차이점 완벽 정리

위 예제에서는 KeyListener와 ActionListener 인터페이스를 모두 구현했습니다. 인터페이스를 직접 구현하는 경우에는 keyTyped(), keyPressed(), keyReleased()처럼 해당 인터페이스에 선언된 모든 메서드를 반드시 오버라이딩해야 한다는 점에 유의하세요. 사용하지 않는 메서드가 있더라도 빈 몸체라도 작성해야 하기 때문에 코드가 길어질 수 있습니다.

이벤트 어댑터(Event Adapter)란?

  • 추상 클래스(Abstract class) 형태로 제공되며, 다양한 이벤트를 수신하기 위한 용도로 사용됩니다.
  • Event Adapter 클래스는 EventListener 인터페이스의 모든 메서드에 대한 기본 구현을 이미 제공합니다.
  • 대표적인 Event Adapter 클래스로는 FocusAdapter, KeyAdapter, MouseAdapter, WindowAdapter 등이 있습니다.

Event Adapter 예제

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class KeyAdapterTest {
    private JFrame frame;
    private JLabel headLabel;
    private JLabel msgLabel;
    private JPanel controlPanel;
    public KeyAdapterTest() {
        initializeUI();
    }
    private void initializeUI() {
        frame = new JFrame("KeyAdapter class");
        frame.setSize(350, 275);
        frame.setLayout(new GridLayout(3, 1));
        headLabel = new JLabel("", JLabel.CENTER);
        msgLabel = new JLabel("", JLabel.CENTER);
        msgLabel.setSize(300, 100);
        frame.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent windowEvent) {
                System.exit(0);
            }
        });
        controlPanel = new JPanel();
        controlPanel.setLayout(new FlowLayout());
        frame.add(headLabel);
        frame.add(controlPanel);
        frame.add(msgLabel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }
    private void showMouseApapter() {
        headLabel.setText("KeyAdapter Test");
        final JTextField textField = new JTextField(10);
        JButton displayButton = new JButton("Display");
        displayButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                msgLabel.setText("You entered : " + textField.getText());
            }
        });
        textField.addKeyListener(new KeyAdapter() {
            public void keyPressed(KeyEvent e) {
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    msgLabel.setText("You entered : " + textField.getText());
                }
            }
        });
        controlPanel.add(textField);
        controlPanel.add(displayButton);
        frame.setVisible(true);
    }
    public static void main(String[] args) {
        KeyAdapterTest test = new KeyAdapterTest();
        test.showMouseApapter();
    }
}

실행 결과

Java 이벤트 리스너 인터페이스와 이벤트 어댑터 클래스의 차이점 완벽 정리

위 예제에서는 KeyAdapter와 WindowAdapter를 익명 내부 클래스로 활용했습니다. KeyAdapter를 상속하면 필요한 메서드인 keyPressed()만 오버라이딩하면 되고, 나머지 메서드들은 어댑터 클래스가 기본 구현을 제공하므로 불필요한 빈 메서드를 작성할 필요가 없습니다.

핵심 차이점 요약

구분EventListener 인터페이스Event Adapter 클래스
형태인터페이스(interface)추상 클래스(abstract class)
메서드 구현모든 메서드를 직접 오버라이딩해야 함필요한 메서드만 선택적으로 오버라이딩 가능
코드 간결성사용하지 않는 메서드도 빈 몸체로 작성해야 함불필요한 코드 없이 간결하게 작성 가능
다중 상속여러 리스너 인터페이스를 동시에 구현 가능클래스 특성상 하나의 어댑터만 상속 가능

정리하면, 이벤트 관련 메서드를 모두 구현해야 하는 경우나 하나의 클래스에서 여러 리스너를 함께 사용하고 싶다면 EventListener 인터페이스를 직접 구현하는 것이 적합하고, 일부 메서드만 필요하다면 Event Adapter 클래스를 상속받아 코드를 더 간결하게 작성하는 것이 좋습니다.