정규표현식(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);
}
}
출력결과

'학원 > 복기' 카테고리의 다른 글
0425 - java.io 패키지, 입출력 스트림, 파일 입출력 (0) | 2023.04.25 |
---|---|
0424 - javax.swing 패키지 (0) | 2023.04.24 |
0420 - 제너릭, Collection 클래스, Set 인터페이스, List 인터페이스, Map 인터페이스 (0) | 2023.04.20 |
0419 - java.util 패키지 (Random, UUID, Date 클래스) / java.text 패키지 (SimpleDateFormat, DecimalFormat 클래스) (0) | 2023.04.19 |
0417 - StringBuffer 클래스,Wrapper 클래스, Integer 클래스 / 스레드, 다중스레드, 스레드 동기화 (0) | 2023.04.17 |