자바 객체지향 프로그래밍 - 10장: 이벤트 기반 프로그래밍
이번 블로그 포스트에서는 자바 프로그래밍의 10장에서 다루는 이벤트 기반 프로그래밍에 대해 살펴보겠습니다. 이벤트 기반 프로그래밍은 GUI 응용 프로그램에서 필수적인 개념으로, 사용자의 입력이나 시스템 이벤트에 따라 프로그램이 반응하는 방식을 이해하는 것이 중요합니다. 이번 장에서는 이벤트 리스너, 이벤트 객체, 그리고 다양한 이벤트 처리 방법을 코드 예제와 함께 설명하겠습니다.
1. 이벤트 기반 프로그래밍이란?
이벤트 기반 프로그래밍(Event-Driven Programming)은 프로그램의 흐름이 이벤트에 의해 결정되는 방식입니다. 이벤트는 사용자의 입력(예: 마우스 클릭, 키보드 입력), 센서로부터의 입력, 네트워크로부터의 데이터 송수신, 또는 다른 응용 프로그램이나 스레드로부터의 메시지로 발생할 수 있습니다. 이러한 이벤트가 발생하면 이벤트를 처리하는 루틴(이벤트 리스너)이 실행됩니다.
이벤트 기반 프로그래밍의 특징은 프로그램 내의 코드가 언제 실행될지 전적으로 이벤트 발생에 따라 결정된다는 점입니다.
2. 자바의 이벤트 처리 구조
자바에서 이벤트 처리의 기본 구조는 다음과 같습니다:
- 이벤트 발생: 예를 들어 마우스 클릭이나 키보드 입력이 발생합니다.
- 이벤트 객체 생성: 현재 발생한 이벤트에 대한 정보를 가진 객체가 생성됩니다.
- 이벤트 리스너 호출: 이벤트를 처리하도록 설정된 코드(이벤트 리스너)가 호출됩니다.
- 이벤트 리스너 실행: 이벤트 리스너가 이벤트 객체를 전달받아 실행됩니다.
3. 이벤트 리스너 작성 방법
이벤트 리스너는 이벤트를 처리하는 코드를 작성하는 방식으로, 다음 세 가지 방법으로 작성할 수 있습니다:
- 독립 클래스: 이벤트 리스너를 별도의 클래스로 작성하여 여러 곳에서 사용할 수 있습니다.
- 내부 클래스: 이벤트 리스너를 특정 클래스 내부에 멤버처럼 작성합니다.
- 익명 클래스: 클래스 이름 없이 간단하게 리스너를 작성할 수 있습니다.
4. 코드 예제: 독립 클래스로 Action 이벤트 리스너 작성
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class IndepClassListener extends JFrame {
public IndepClassListener() {
setTitle("Action 이벤트 리스너 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
btn.addActionListener(new MyActionListener()); // Action 리스너 달기
c.add(btn);
setSize(350, 150);
setVisible(true);
}
public static void main(String[] args) {
new IndepClassListener();
}
}
class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
}
}
위 예제에서는 MyActionListener 클래스를 독립된 클래스로 작성하여 JButton의 ActionListener로 등록했습니다. 버튼을 클릭할 때마다 버튼의 텍스트가 "Action"에서 "액션"으로 변경됩니다.
5. 코드 예제: 내부 클래스로 Action 이벤트 리스너 작성
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class InnerClassListener extends JFrame {
public InnerClassListener() {
setTitle("Action 이벤트 리스너 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
btn.addActionListener(new MyActionListener());
c.add(btn);
setSize(350, 150);
setVisible(true);
}
private class MyActionListener implements ActionListener {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
setTitle(b.getText()); // 프레임 타이틀에 버튼 문자열 출력
}
}
public static void main(String[] args) {
new InnerClassListener();
}
}
내부 클래스로 작성된 MyActionListener는 외부 클래스의 멤버에 쉽게 접근할 수 있습니다. 이 예제에서는 버튼의 텍스트를 프레임의 타이틀로 설정하는 기능을 추가했습니다.
6. 코드 예제: 익명 클래스로 Action 이벤트 리스너 작성
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class AnonymousClassListener extends JFrame {
public AnonymousClassListener() {
setTitle("Action 이벤트 리스너 작성");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.setLayout(new FlowLayout());
JButton btn = new JButton("Action");
c.add(btn);
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
JButton b = (JButton) e.getSource();
if (b.getText().equals("Action"))
b.setText("액션");
else
b.setText("Action");
setTitle(b.getText());
}
});
setSize(350, 150);
setVisible(true);
}
public static void main(String[] args) {
new AnonymousClassListener();
}
}
익명 클래스를 사용하여 이벤트 리스너를 작성하면, 코드가 더 간결해집니다. 클래스 이름을 정의하지 않고, 이벤트 리스너를 직접 구현하여 버튼 클릭 시 텍스트와 타이틀을 변경합니다.
7. 마우스 이벤트 처리
마우스 이벤트는 사용자가 마우스를 클릭하거나 드래그할 때 발생합니다. 다음은 마우스 클릭 이벤트를 처리하는 예제입니다.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class MouseListenerEx extends JFrame {
private JLabel la = new JLabel("Hello");
public MouseListenerEx() {
setTitle("Mouse 이벤트 예제");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.addMouseListener(new MyMouseListener());
c.setLayout(null);
la.setSize(50, 20);
la.setLocation(30, 30);
c.add(la);
setSize(250, 250);
setVisible(true);
}
class MyMouseListener implements MouseListener {
public void mousePressed(MouseEvent e) {
int x = e.getX();
int y = e.getY();
la.setLocation(x, y);
}
public void mouseReleased(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
}
public static void main(String[] args) {
new MouseListenerEx();
}
}
이 예제에서는 MouseListener 인터페이스를 구현하여 마우스 버튼이 눌러졌을 때(mousePressed) JLabel의 위치를 마우스 위치로 이동시키는 기능을 구현했습니다.
8. 키보드 이벤트 처리
키보드 이벤트는 사용자가 키보드를 누를 때 발생합니다. 다음은 키보드 이벤트를 처리하여 특정 키를 눌렀을 때 배경색을 변경하는 예제입니다.
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
public class KeyCodeEx extends JFrame {
private JLabel la = new JLabel();
public KeyCodeEx() {
setTitle("Key Code 예제 : F1키:초록색, % 키: 노란색");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Container c = getContentPane();
c.addKeyListener(new MyKeyListener());
c.add(la);
setSize(300, 150);
setVisible(true);
c.setFocusable(true);
c.requestFocus();
}
class MyKeyListener extends KeyAdapter {
public void keyPressed(KeyEvent e) {
la.setText(e.getKeyText(e.getKeyCode()));
if (e.getKeyChar() == '%')
getContentPane().setBackground(Color.YELLOW);
else if (e.getKeyCode() == KeyEvent.VK_F1)
getContentPane().setBackground(Color.GREEN);
}
}
public static void main(String[] args) {
new KeyCodeEx();
}
}
이 예제에서는 KeyAdapter 클래스를 확장하여 F1 키를 누르면 배경색이 초록색으로, % 키를 누르면 노란색으로 변경하는 기능을 구현했습니다.
결론
이벤트 기반 프로그래밍은 자바에서 매우 중요한 개념으로, 사용자의 다양한 입력에 반응하는 응용 프로그램을 만들기 위해 필수적입니다. 이번 장에서는 다양한 이벤트 리스너와 객체, 그리고 이를 활용한 실습 예제를 통해 이벤트 기반 프로그래밍의 기초를 배웠습니다.
'Java' 카테고리의 다른 글
명품자바 프로그래밍의 기초: 12장 (0) | 2024.09.15 |
---|---|
명품자바 프로그래밍의 기초: 11장 (0) | 2024.09.13 |
명품자바 프로그래밍의 기초: 9장 (0) | 2024.09.02 |
명품자바 프로그래밍의 기초: 8장 (0) | 2024.09.02 |
명품자바 프로그래밍의 기초: 7장 (0) | 2024.08.25 |