본문 바로가기

학원/복기

0421 - 정규표현식, java.awt 패키지,이벤트 처리 프로그램

정규표현식(RegularExpression)

 : 메타문자(Meta Character), 회피문자(Escape Character)등을 사용하여 일정한 규칙의 문자열을 표현하는 방법 
  정규표현식은 사용자 입력값에 대한 검증을 할 때 많이 사용한다.

메타문자

^문자 : 문자(열)로 시작됨을 의미 
문자$ : 문자(열)로 종료됨을 의미
. : 임의의 문자 하나를 의미 (\ 문자는 표현 불가능) 
[문자1문자2문자3] : 나열된 문자 중 하나를 의미 
[^문자1문자2문자3] : 나열된 문자를 제외한 문자 중 하나를 의미 
[문자1-문자2] : [문자1]에서 [문자2] 범위의 문자 중 하나를 의미 
문자열|문자열2|문자열3 : 나열된 문자열 중 하나를 의미 
문자열+ : 문자열이 1번이상 반복됨을 의미 
문자열* : 문자열이 0번이상 반복됨을 의미 (앞 문자가 없을 수도, 무한정 많을 수도 있음) 
문자열? : 문자열이 0번 또는 1번 존재함을 의미
문자열{숫자} : 문자열이 [숫자]만큼 반복됨을 의미 
문자열{숫자1,숫자2} : 문자열이 [숫자1]부터 [숫자2] 범위만큼 반복됨을 의미
(?!)문자열 : 문자열에서 대소문자를 구분하지 않음을 의미 
(?=문자열) : 문자열이 반드시 포함됨을 의미
(!=문자열) : 문자열이 반드시 포함되지 않음을 의미

 

회피문자

\s : 공백이 있는 문자열을 의미
\S : 공백이 없는 문자열을 의미
\w : 영문자,숫자,특수문자(_)의 문자로만 구성된 문자열을 의미
\W : 영문자,숫자,특수문자(_)의 문자를 제외한 나머지 구성된 문자열을 의미 
\d : 숫자 형태의 문자로만 구성된 문자열을 의미 
\D : 숫자 형태의 문자를 제외한 문자로 구성된 문자열을 의미
\메타문자 : 메타문자를 일반문자로 표현됨을 의미 - ex) \. : . 문자 //자바에서는 역슬래시를 두번 사용해야 처리된다

Pattern 클래스 : 정규표현식을 사용하기 위한 기능의 메소드를 제공하는 클래스 Pattern.matches(String regEx, CharSequence input) : 정규표현식과 입력값을 비교하여 정규표현식의 패턴과 입력값의 패턴이 다르면 [false]를 반환하고 같으면 [true]를 반환**CharSequence : String의 부모

실습

키보드로 사용자에게 값을 입력받아 형식에 맞는 값인지를 비교하여 출력하는 프로그램

=> 형식에 맞지 않는 값이 입력될 경우 에러 메세지 출력 후 프로그램 종료

사용자에게 아이디를 입력받아 형식에 맞는 값인지를 비교
아이디 형식(패턴) : 영문자로 시작되며 영문자,숫자,특수문자(_)의 조합으로 6~20 범위의 문자들로 구성된 문자열 
import java.util.Scanner;
import java.util.regex.Pattern;

public class RegularExpressionApp {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        
		System.out.print("아이디 입력 >> ");
		String id = scanner.nextLine();
		
		if(id == null || id.equals("")) {//사용자 입력값이 없는 경우
			System.out.println("[에러]아이디를 반드시 입력해 주세요.");
			System.exit(0);
		}
		//아이디 패턴을 정규표현식으로 표현하여 저장 
		//String idReg = "^[a-zA-Z][a-zA-Z0-9_]{5,19}$"; 
		String idReg = "^[a-zA-Z]\\w{5,19}$"; 
		
		//Pattern 클래스 : 정규표현식을 사용하기 위한 기능의 메소드를 제공하는 클래스 
		//Pattern.matches(String regEx, CharSequence input) : 정규표현식과 입력값을 비교하여
		//정규표현식의 패턴과 입력값의 패턴이 다르면 [false]를 반환하고 같으면 [true]를 반환 
		if(!Pattern.matches(idReg, id)) {
			System.out.println("[에러]아이디를 형식에 맞게 입력해 주세요.");
			System.exit(0);
		} 
		
		System.out.println("[메세지]형식에 맞는 아이디를 입력 하였습니다.");
	}
}
사용자에게 비밀번호를 입력받아 형식에 맞는 값인지를 비교
비밀번호 형식(패턴) : 영문자, 숫자, 특수문자가 반드시 1번 이상 포함되며 8~30 범위의 문자들로 구성된 문자열
import java.util.Scanner;
import java.util.regex.Pattern;

public class RegularExpressionApp {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        
        System.out.print("비밀번호 입력 >> ");
		String password = scanner.nextLine();
		
		if(password == null || password.equals("")) {
			System.out.println("[에러]비밀번호를 반드시 입력해 주세요.");
			System.exit(0);
		}
		
		//[-]를 사용하고 싶으면 맨 뒤에 넣어야한다. 중간에 넣으면 '범위'를 의미하기 때문 
		String passwordReg = "^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*[~!@#$%^&*_-]).{8,30}$";
		if(!Pattern.matches(passwordReg, password)) {
			System.out.println("[에러]비밀번호를 형식에 맞게 입력해 주세요.");
			System.exit(0);
		}
		
		System.out.println("[메시지]형식에 맞는 비밀번호를 입력 하셨습니다.");
	}
}
사용자에게 이메일을 입력받아 형식에 맞는 값인지를 비교
비밀번호 형식(패턴) : [아이디@도메인] 형식
import java.util.Scanner;
import java.util.regex.Pattern;

public class RegularExpressionApp {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        
        System.out.print("이메일 입력 >> ");
		String email = scanner.nextLine();
		
		if(password == null || password.equals("")) {
			System.out.println("[에러]비밀번호를 반드시 입력해 주세요.");
			System.exit(0);
		}
		
//		[\\.] : 회피문자 >> [.] (자바에서는 역슬래시를 두번 사용해야 역슬래시 처리된다) 
//		[()]: 먼저 처리할 수 있도록 하기 위해 사용 
		String emailReg = "^([a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+)*$";
		
		if(!Pattern.matches(emailReg, email)) {
			System.out.println("[에러]이메일을 형식에 맞게 입력해 주세요.");
			System.exit(0);
		}

		System.out.println("[메시지]형식에 맞는 이메일을 입력 하셨습니다.");
		
		scanner.close();
	}
}

GUI(Graphic User INterface) 프로그램

CUI(Character User Interface) 프로그램 : 문자 중심의 실행 환경에서 동작되는 프로그램  
GUI(Graphic User INterface) 프로그램 : 그래픽 중심의 실행 환경에서 동작되는 프로그램  
=> 컴퍼넌트를 이용하여 작성된 프로그램  

java.awt 패키지

java.awt 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지 
javax.swing 패키지 : GUI 프로그램을 작성하기 위한 클래스가 선언된 패키지 => java.awt의 확장 패키지 - Java 컴포넌트 제공 -> awt 패키지를 사용해야만 swing 패키지를 사용할 수 있다 (기본 패키지를 사용해야만 확장 패키지를 사용할 수 있다) 

컴퍼넌트(Component)

컴퍼넌트(Component) : GUI 프로그램에서 사용자 환경(UI - User Interface)를 구현하기 위한 클래스  
종류) Button, List, Label, Canvas, Checkbox,Choice, Scrollbar, TextField, TextArea  

컨테이너(Container)

컨테이너(Container) : 컴퍼넌트를 배치할 수 있는(담을 수 있는) 컴퍼넌트 (Component를 상속받는다) 
 => 독립적 컨테이너 : Frame, Window, Dialog 등 - 독립적으로 사용 가능 
 => 종속적 컨테이너 : Panel, ScrollPane 등 - 다른 컨테이너에 배치하여 사용 가능 

Frame 클래스

Frame 클래스 : 메뉴가 존재하는 컨테이너를 생성하기 위한 클래스

Frame 클래스의 Frame(String title) 생성자로 객체를 생성하면 제목이 설정된 프레임 생성 

public class FrameOneApp {
	public static void main(String[] args) {
		//Frame frame = new Frame(); 
		Frame frame = new Frame("프레임 연습");
	}
}
public class FrameOneApp {
	public static void main(String[] args) {
		Frame frame = new Frame("프레임 연습"); 
		
		//Component.setSize(int width, int height) : 컴포넌트의 크기를 변경하는 메소드 
		// => GUI 프로그램에서 크기 또는 위치를 표현하는 단위는 픽셀(Pixel) 단위로 표현하여 설정 
		//픽셀(Pixel) : 하나의 색으로 표현하는 점(Dot) 
		frame.setSize(400,300);
		
		//Component.setLocation(int x, int y) : 컴포넌트의 출력 위치를 변경하는 메소드 
		frame.setLocation(600,100);
		
		//Component.setVisible(boolean b) : 컴퍼넌트를 보이지 않게 처리하거나 보이도록 
		//처리하는 메소드 - false : 보여지지 않도록 처리, true : 보여지도록 처리 
		frame.setVisible(true);
	}
}

GUI 프로그램을 UI 구성 및 이벤트 처리를 위해 Frame 클래스를 상속받아 작성하는 것을 권장한다.

기본적인 GUI 프로그램 형태 

import java.awt.Frame;

public class FrameTwoApp extends Frame {
	private static final long serialVersionUID = 1L; 
	
	//생성자에서 프레임을 구성하는 디자인 설정 - UI구현 
	public FrameTwoApp(String title) {
		super(title); //Frame(부모)의 생성자 호출
				//Frame(String title) 생성자를 이용하여 Frame 객체 생성 

		//Frame.setTitle(String title) : 프레임의 제목을 변경하는 메소드 
		//setTitle(title);
		
		//Component.setBounds(int x, int y, int width, int height) : 컴퍼넌트의 출력 위치와
		//크기를 변경하는 메소드 
		setBounds(600,100,400,300);
		
		//Frame.setResizable(boolean resize) : 컴퍼넌트의 크기 변경 여부를 설정하기 위한 메소드
		// => false : 프레임 크기 변경 불가능, true : 프레임 크기 변경 가능 (default값 = true)
		//setResizable(false);
		
		setVisible(true);
	}
	
	//생성자 호출할 용도 
	public static void main(String[] args) {
		//Frame 클래스를 상속받은 자식클래스로 객체 생성
		// => Frame 객체 생성 (=프레임 생성) 
		new FrameTwoApp("프레임 연습");
	}
}

출력결과


이벤트 처리 프로그램 

이벤트 처리 프로그램: 컴퍼넌트에서는 다양한 이벤트가 발생되며 컴퍼넌트에서 이벤트가 발생될 경우 원하는 기능이 구현하여 실행되도록 프로그램을 작성한 것 

이벤트 처리 프로그램 작성 방법

1.컴퍼넌트와 컨테이너 관련 클래스를 사용하여 디자인 클래스를 작성한다. - UI 구현 
 => Frame 클래스를 상속받아 디자인 클래스 작성 
 => 컴퍼넌트 또는 컨테이너에서 다양한 이벤트 발생 >> 이를 이벤트 소스(Event Source) 라고 부른다.
 => 이벤트와 관련된 XXXEvent 클래스(이벤트 정보를 저장하기 위한 클래스)로 객체가 자동 생성
    ex) Button 컴퍼넌트를 누른 경우 ActionEvent 클래스로 객체 생성 - ActionEvent 발생 

2.이벤트 소스에서 발생된 이벤트를 처리하기 위한 클래스 작성 
 => 이벤트를 처리하기 위한 XXXListener 인터페이스를 상속받아 클래스 작성 
 ex) ActionEvent 처리하고 싶으면 >> ActionListener 인터페이스를 상속받아 이벤트 처리 클래스를 작성한다. 
 => Listener 인터페이스에서는 컴퍼넌트에서 발생된 이벤트를 처리하기 위해 추상메소드를 제공한다. 
 => Listener 인터페이스를 상속받은 자식클래스에서 추상메소드를 오버라이드 선언하여 오버라이드 선언된 메소드에
    이벤트 처리 명령을 작성 

3.이벤트 소스에서 이벤트가 발생되면 이벤트 처리 클래스의 객체를 제공받아 이벤트 처리 명령이 실행되도록 설정 - Component.addXXXListener(Listener l) 메소드 호출 
 => Component.addXXXListener(Listener 1) : 컴포넌트의 이벤트를 처리하기 위한 이벤트 처리 객체

실습 - [EXIT]버튼을 누른 경우 프로그램을 종료하는 기능의 GUI 프로그램 작성  

import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class EventHandleApp extends Frame{
	private static final long serialVersionUID = 1L;
	
	public EventHandleApp(String title) {
		super(title);
		
       		//프레임의 배치관리자를 [FlowLayout]으로 변경
		setLayout(new FlowLayout());
		Button exit = new Button("EXIT");	
		exit.setFont(new Font(Font.SANS_SERIF,Font.BOLD,30));
		add(exit);
			
		//컴퍼넌트에 이벤트 처리 객체 등록 
		// => Button 컴퍼넌트에서 ActionEvent가 발생될 경우 EventHandle 클래스의 객체를
		//제공받아 이벤트 처리 메소드를 자동 호출하여 이벤트 처리 
		exit.addActionListener(new EventHandle());
		
		setBounds(800, 200, 300, 300);
		setVisible(true);
	}
	
	public static void main(String[] args) {
		new EventHandleApp("이벤트처리");
	} 
}

//이벤트 처리 기능을 제공하기 위한 클래스 - Listener 인터페이스를 상속받아 작성
// => Button 컴퍼넌트에서 발생된 ActionEvent를 처리하기 위한 클래스 
class EventHandle implements ActionListener {
	//이벤트 처리 명령을 작성하기 위한 메소드 (이벤트 처리 메소드)
	@Override
	public void actionPerformed(ActionEvent e) {
		System.exit(0);
	}
	
}

출력결과