다라다라V
article thumbnail
Published 2022. 11. 17. 09:52
[JAVA] 15 이벤트 처리 코딩언어/JAVA
728x90
반응형

 

 

📌 이벤트 처리

📚 이벤트 기반 프로그래밍

이벤트 발생에 의해 프로그램 흐름이 결정되는 방식의 프로그램 패러다임입니다.

📃 이벤트

  • 윈도우 프로그래밍에서 어떤 특정 행동이 발생한 그 자체를 의미
  • 사용자의 입력  : 마우스/키보드 조작
  • 네트워크로부터 데이터 송수신
  • 다른  응용 프로그램/스레드로부터의 메시지

📃 이벤트  기반  프로그래밍(Event Driven Programming)

  • 이벤트 중심 프로그래밍
  • 어떤 사건에 따라 제어 흐름이 결정되어 동작을 처리

📚 JAVA에서 이벤트 처리 구조

각 이벤트 소스마다 이벤트 리스너와 연결하여 이벤트를 처리합니다.

📃 이벤트 소스(Event Souce) 객체 

  • 이벤트를 발생시킨 컴포넌트 객체
  • 사용자로부터 입력을 기다리는 객체 ex) 버튼, 입출력

 

📃 이벤트 리스너(Event Listener) 객체 

  • 이벤트 소스에서 발생한 이벤트를 처리하는 객체
  • 이벤트 발생시, 연관된 이벤트 리스너는 이벤트 핸들러 메서드를 자도으로 호출하여 이벤트 전달

 

📃 이벤트 핸들러(Event Handler) 메서드

  • 전달된 이벤트를 처리하는 메서드
  • 발생된 이벤트에 따라 지정된 동작 수행

📚 JAVA에서 이벤트 처리 과정

1. 이벤트 소스에서 이벤트 발생

  • 사용자의 조작 혹은 프로그램 자체적으로
  • 개발자가 처리할 필요 X

 

2. 이벤트 객체 생성

  • 현재 발생한 이벤트에 대한 정보를 가진 객체
  • 개발자가 처리할 필요 X

 

3. 이벤트 소스에 연관된 리스너에 이벤트 객체 전달

 

 

4. 이벤트 리스너의 이벤트 핸들러 메서드 실행

  • 개발자는 이벤트 핸들러 메서드만 처리하면 됨
  • 이벤트 핸들러 메서드에 이벤트 객체 전달
  • 이벤트 핸들러 코드 실행

📌 이벤트 처리 방법

📚 이벤트 처리를 위한 프로그래밍

1단계: 이벤트 소스 결정

  • 이벤트를 발생시킬 컴포넌트 결정
  • 컴포넌트에서 여러 개의 이벤트 중 관심 있는 이벤트를 골라 이벤트 발생될 종류를 결정

 

2단계: 이벤트 리스너 구현

  • 이벤트를 처리할 객체의 클래스를 이벤트 리스너 인터페이스로 구현
  • 인터페이스의 추상 메서드를 오버라이딩
  • 관심있는 메서드만 따로 고라 재정의하는 것 
  • 이벤트 발생시 수행할 동작을 기술

 

3단계: 이벤트 소스와 이벤트 리스너 연결

  • addXXXListener() 메서드를 통해 컴포넌트에 이벤트 리스너를 연결
  • 이벤트 발생시 이를 감지해 처리할 수 있도록

 

 

📚 이벤트 처리

  • 리스너 객체 생성하는 방법은 여러가지
  • 이벤트를 처리하는 다양한 방법 제공
  • 각 방법마다 효율성/가독성의 차이가 있으므로 적절한 방법 선택 필요

 

addXXXListener()의 인수인 리스너를 생성하는 방법은 다음과 같습니다.

  1. 현재 클래스 사용
  2. 일반 클래스 사용
  3. 내부 클래스 ㅅ용
  4. 익명 내부 클래스 사용
  5. 익명 내부 클래스 임시 객체 사용

📚 방법1: 현재 클래스 사용

리스너 인터페이스를 구현하는 일반 클래스를 작성하고 추상 메서드를 구현

 

■ 장점

  • 이벤트 리스너를 여러 클래스에서 사용할 때 적합

 

■ 단점

  • 리스너 구현을 위해 별도의 클래스 선언 필요
  • 필요시,생성자에서 컴포넌트 객체에 대한 참조를 전달받아야 해당 컴포넌트에 접근 가능

 

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloEx implements ActionListener{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame = new JFrame("HelloEx");
		
		buildGUI(); // GUI 설정하는 메서드를 따로 나눔 
		
		frame.setBounds(500,500,100,100);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text = new JTextField();
		JButton button=  new JButton("확인");
		button.addActionListener(this);
		
		label = new JLabel("Hello World");
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
	}
	

	@Override
	// 버튼을 눌렀을 때 발생하는 이벤트 처리 메서드 
	public void actionPerformed(ActionEvent e) {
		String name = text.getText();
		label.setText("Hello, "+name);
		
		text.setText("");
	}
	
	// main에서는 GUI 객체를 만드는 일만 할 것
	public static void main(String[] args) {
		new HelloEx();
	}


}

 

 

📚 방법2: 일반 클래스 사용

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloEx {
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame = new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,500,100,100);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler(text, label));
		
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	public static void main(String[] args) {
		new HelloEx();
	}


}

// 이벤트를 처리하는 별도의 클래스ㅡㄹㄹ 작성한 것
class ActionEventHandler implements ActionListener{
	
	private JTextField text;
	private JLabel label;
	
	ActionEventHandler(JTextField text, JLabel label){
		this.text=text;
		this.label=label;
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		String name=text.getText();
		label.setText("Hello, "+name);
		
		text.setText("");
		
	}
	
}

 

 

📚 방법3: 내부 클래스(Inner class) 사용

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloEx{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,500,100,100);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		// 애부에 클래스를 만들어서 사용
		button.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				String name=text.getText();
				label.setText("Hello, "+name);
				text.setText("");
			}
			
		}); 
				
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);		
	}

	
	public static void main(String[] args) {
		new HelloEx();
	}
}

 

📚 방법4:  익명 내부 클래스 사용

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloEx{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,500,100,100);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler()); 
				
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	// 내부에 클래스를 정의하여 처리
	class ActionEventHandler implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			String name=text.getText();
			label.setText("Hello, "+name);
			text.setText("");
		}
	}
	
	public static void main(String[] args) {
		new HelloEx();
	}
}

 

 

📚 방법5: 익명 내부 클래스 임시 객체 사용

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class HelloEx{
	
	private JFrame frame;
	private JTextField text;
	private JLabel label;
	
	public HelloEx() {
		frame=new JFrame("HelloEx");
		
		buildGUI();
		
		frame.setBounds(500,500,100,100);
		
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
	
	
	private void buildGUI() {
		text=new JTextField();
		label=new JLabel("Hello World");
		
		JButton button=new JButton("확인");
		button.addActionListener(new ActionEventHandler()); 
				
		frame.add(text, BorderLayout.CENTER);
		frame.add(button, BorderLayout.EAST);
		frame.add(label, BorderLayout.SOUTH);
		
	}
	
	class ActionEventHandler implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			String name=text.getText();
			label.setText("Hello, "+name);
			text.setText("");			
		}
	}
	
	public static void main(String[] args) {
		new HelloEx();
	}
}

 

반응형

'코딩언어 > JAVA' 카테고리의 다른 글

[JAVA] 14-2 Swing의 기본 구성  (0) 2022.11.09
[JAVA] 14-1 Swing의 기본 특징  (0) 2022.11.08
[JAVA] 13. 제네릭과 컬렉션  (0) 2022.11.05
[JAVA] 12. 예외처리  (0) 2022.11.04
[JAVA] 11 추상 클래스와 인터페이스  (0) 2022.11.03
profile

다라다라V

@DaraDaraV

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!