정규식과 기본적인 형변환 객체들을 이용한 입력 프로그램 예제

안희수·2021년 4월 6일
0

중점 처리 내용
입력 받은 데이터를 기반으로

1. 단계
데이터를 입력받았는가 확인(입력 값 없을 경우에 처리)

2. 단계
객체 데이터에서 문자열인지 정수형인지 확인
(데이터 형변환 처리)

3. 단계
정규식 비교를 통해 영문 & 한글 혼합인지 여부 확인
정규식 패턴 집합에 대한 개별 비교 처리 기능
(전화번호 및 이메일 주소 한글과 숫자 영문 처리)

4. 단계
최종적으로
데이터 입력 결과에 문제가 없는지 확인
'Y' 나 'N' 이 아닌 오입력 방지 기능까지 처리

5. 단계
정수형과 문자열 구별을 정확하게 처리 하였는지 다시 한번 확인


프로그램 실행 출력 결과물

>>System Message : Please Input Data...

>>Input Error : Input Data is Blank.
>>Please Check Your Input Data Again.
>>System Info : From String Object Returned [  ] Data.
>>System Message : Process Retry

>>System Message : Please Input Data...
010-1234-5678

>>System Info : From String Object Returned [ 010-1234-5678 ] Data.
>>System Message : Value : 010-1234-5678
>>System Message : Are you sure decide Your Data ?
아니요

>>Input Error : Decision Must Be ( Y or N )
>>System Message : Process Retry

>>System Message : Please Input Data...
02-123-4567

>>System Info : From String Object Returned [ 02-123-4567 ] Data.
>>System Message : Value : 02-123-4567
>>System Message : Are you sure decide Your Data ?
N

>>System Message : User denied InputData.
>>System Message : Process Retry

>>System Message : Please Input Data...
anhesu4@gmail.com

>>System Info : From String Object Returned [ anhesu4@gmail.com ] Data.
>>System Message : Value : anhesu4@gmail.com
>>System Message : Are you sure decide Your Data ?
N

>>System Message : User denied InputData.
>>System Message : Process Retry

>>System Message : Please Input Data...
로켓Rocket

>>System Info : From String Object Returned [ 로켓Rocket ] Data.
>>System Message : Value : 로켓Rocket
>>Input Error : You use English mixed with Hangul.
>>Please Check Input Data Again.
>>System Message : Value : 로켓Rocket
>>System Message : Process Retry

>>System Message : Please Input Data...
서울시 강동구 명일동 아무개 맨션 101동 1104호

>>System Info : From String Object Returned [ 서울시 강동구 명일동 아무개 맨션 101동 1104호 ] Data.
>>System Message : Value : 서울시 강동구 명일동 아무개 맨션 101동 1104호
>>System Message : Are you sure decide Your Data ?
N

>>System Message : User denied InputData.
>>System Message : Process Retry

>>System Message : Please Input Data...
안희수

>>System Info : From String Object Returned [ 안희수 ] Data.
>>System Message : Value : 안희수
>>System Message : Are you sure decide Your Data ?
N

>>System Message : User denied InputData.
>>System Message : Process Retry

>>System Message : Please Input Data...
1000

>>System Info : From Intiger Object Returned [ 1000 ] Data.
>>System Message : Value : 1000
>>System Message : Are you sure decide Your Data ?
N

>>System Message : User denied InputData.
>>System Message : Process Retry

>>System Message : Please Input Data...
자바 프로그래밍

>>System Info : From String Object Returned [ 자바 프로그래밍 ] Data.
>>System Message : Value : 자바 프로그래밍
>>System Message : Are you sure decide Your Data ?
ㅛ

>>Input Error : Decision Must Be ( Y or N )
>>System Message : Process Retry

>>System Message : Please Input Data...
anhesu

>>System Info : From String Object Returned [ anhesu ] Data.
>>System Message : Value : anhesu
>>System Message : Are you sure decide Your Data ?
Y

>>System Message : User decided InputData.
>>System Message : Value : anhesu
>>System Message : Process Exit

1. main
프로그렘 실행 메인

package study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class main {

	public static void main(String[] args) {
		
		boolean _repeat = false;
		
		Process proc = new Process();
		_repeat = true; 
		
		System.out.println(">>System Message : Please Input Data...");
		
		while(_repeat) {
			
			/* ReadData 
			 * 입력값이 정수형인지 문자열인지 판단하는 기능 
			 * 입력 값에 아무런 값도 입력이 되지 않았는지 판단하는 기능
			 * */ 				
			_repeat = proc.ReadData(); 
						
			if(_repeat) {
				System.out.println("\n>>System Message : Process Retry");
				System.out.println("\n>>System Message : Please Input Data...");
			} else {
				System.out.println("\n>>System Message : Process Exit");
			}
			
		}
	}
}

2. DataProcess
데이터 전처리 클래스

package study;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

// 데이터 전처리 클래스
public class DataProcess {

	private Object RawData = null; // 원시 데이터
	private String  strData = ""; // 문자열 데이터
	private int intData = 0; // 정수형 데이터(값을 비교할 때 문자열을 매번 정수형으로 변환하는 것을 방지)
	
	
	public boolean isNumber= false; // 문자열 여부
	public boolean retry = false; // 재시도 여부
	
	
	// input 데이터를 입력받아서 문자열인지 정수인지 판단
	public void getData(String getData) throws IOException {
		
		RawData = getData;
		if(RawData.getClass() == String.class) {
			try {
				if(!getData.toString().equals("")) {
					
					String pattern = "^[0-9]*$"; // 정수인지 여부만 판단하는 정규식
					if(getData.toString().matches(pattern)) {
						intData = Integer.parseInt(getData.toString());
						strData = String.valueOf(intData);
						isNumber = true;
						retry = false;
					} else {
						strData = getData.toString();
						isNumber = false;
						retry = false;	
					} 
					
				} else {
					strData = getData.toString();
					isNumber = false;
					retry = false;	
				}
				
				
			}catch (NumberFormatException e) {
				intData = 0;
				strData = getData.toString();
				isNumber = false;
				retry = true;
				e.printStackTrace();
			}
			
		}
		
		if(strData.isEmpty()) {
			System.out.print(">>Input Error : Input Data is Blank.\n>>Please Check Your Input Data Again.");
			retry = true; // 입력받은 값이 0 이나 공백일 경우에만 재시도
		} else {
			retry = false;
		}
	} 

	// 입력 받은 값의 내용을 반환하는 메소드
	public String ReturnValue() {
		String Value = "";
		
		if(isNumber) {
			System.out.print(String.format("\n>>System Info : From Intiger Object Returned [ %d ] Data.", intData));
			Value = String.valueOf(intData);
		} else {
			System.out.print(String.format( "\n>>System Info : From String Object Returned [ %s ] Data.", strData));
			Value = strData;
		}

		return Value;
	}
	
	// 알파벳과 한글이 혼용되었는지 판별하는 메소드
	public boolean combineAlphabet(String inputData) {
		boolean combine = true;		
		String [] PatternCase = {
			 "^[a-zA-Z0-9]*$" // 알파벳과 특수문자 숫자 조합은 아이디 혹은 이메일 처리를 위해 혼용이 필요
			,"^[ㄱ-ㅎ가-힣]*$" // 순수 한글 패턴
			,"^[ㄱ-ㅎ가-힣0-9\\W]*$" // 한글과 숫자 조합은 이름과 주소를 위해 혼용이 필요
			,"^[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*@[0-9a-zA-Z]([-_.]?[0-9a-zA-Z])*.[a-zA-Z]{2,3}$" // 이메일 패턴
			,"^\\d{3}-\\d{3,4}-\\d{4}$" // 휴대전화 패턴
			,"^\\d{2,3}-\\d{3,4}-\\d{4}$" // 일반 전화 번호 패턴			
		};
		
		// 처음에는 혼합됬다는 가정하에 반복문을 통해서 한 가지라도 정규식일 일치하게 되면 혼합되지 않은 것으로 간주함
		for(String pattern : PatternCase) {
			if(inputData.toString().matches(pattern)){
				combine = false;
			} 
		}
				
		return combine;
	}
	
	// 현재 입력 받은 값이 최종적으로 맞는지 판단 후 재입력 여부를 물어보는 메소드 
	public boolean ConfirmInputData() {
		
		boolean disagreeData = false; // 입력받은 갑을 인정 못함 다시 입력
		System.out.print("\n>>System Message : Are you sure decide Your Data ?\n");
		Scanner sc = new Scanner(System.in);
		String YesNo = sc.next(); // Y or N 한 단어만 사용
		if(!YesNo.equals("Y")) { //Y 가 아닌 것은 전부 재시도
			if(!YesNo.equals("N")) { // N 으로 입력하지 않은 입력에 대한 오류 처리
				System.out.print("\n>>Input Error : Decision Must Be ( Y or N )");
			} else {
				System.out.print("\n>>System Message : User denied InputData.");
			}
			disagreeData = true;
		} 		
		return disagreeData;
	}	
}

3. Process.java
데이터 읽기 & 쓰기 클래스

package study;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 데이터 전처리 과정에서 읽어온 데이터를  가지고 행위를 하는 클래스
public class Process {
	
	public boolean ReadData() {
		
		boolean retry = false; // 잘못된 데이터 입력에 대한 재시도
		boolean confirm = false; // 현재 입력한 데이터가 맞는지 확인하고 재입력 할 것인지 판단
		boolean next = false; // 다음 입력 단계가 있을 경우 지속하여 다른 기능을 실행함		
		
		DataProcess process = new DataProcess();

		try {

			InputStreamReader Ir = new InputStreamReader(System.in);			
			BufferedReader Br = new BufferedReader(Ir);
						
			process.getData(Br.readLine());	
			retry = process.retry;

		} catch (IOException e) {

			e.printStackTrace();
			retry = true;
		}
		
		String readData = process.ReturnValue(); // 반환값을 알기 위해 일는 행위를 반복적으로 하는 것을 방지
		
		if(!readData.equals("")) {
			
			System.out.print("\n>>System Message : Value : " + readData);
			retry = false; // 입력받은 값이 있을 경우에는 읽기 재시도를 하지 않음
			
			if(!process.isNumber) { // 정수형 데이터가 아닌 경우
				// strData 가 알파벳과 한글을 혼용해서 사용하였는지 판별하는 메소드
				if(process.combineAlphabet(readData)) {
					System.out.print("\n>>Input Error : You use English mixed with Hangul.\n>>Please Check Input Data Again.\n");
					System.out.print(">>System Message : Value : " + readData);
					retry = true;
				} else {
					// 현재 입력 받은 값이 최종적으로 맞는지 판단 후 재입력 여부를 물어보는 메소드
					if(process.ConfirmInputData()) {
						retry = true;
					} else {
						System.out.print("\n>>System Message : User decided InputData.");
						System.out.print("\n>>System Message : Value : " + readData);
					}
					
				}
			} else {
				if(process.ConfirmInputData()) {
					retry = true;
				} else {
					System.out.print("\n>>System Message : User decided InputData.");
					System.out.print("\n>>System Message : Value : " + readData);
				}
			}						
		}		
		return retry;		
	}
}
profile
9년차 소프트웨어 개발자 (2024년 재 개편 예정입니다)

0개의 댓글

관련 채용 정보