영보의 SystemOut.log

[Java] 주민번호 정상체크 / 나이 / 성별 / 출신지역 / 띠 / 생년월일 추출 프로그램 만들기 본문

국비교육(아이티센 입사교육)/Java

[Java] 주민번호 정상체크 / 나이 / 성별 / 출신지역 / 띠 / 생년월일 추출 프로그램 만들기

영보로그 2021. 9. 28. 16:39
반응형

 정규표현식


# 정규 표현식이란? Regular expression(Regex)
  - 입력된 문자열이 정해져 있는 형식으로 되어 있는지 검증하는 것을 말한다. 이미 약속된 메타 문자를 제공해준다.
   * 메타 문자란? > 원래 그 문자가 가진 뜻이 아닌 특별한 용도로 사용되는 문자를 말함

문자 내용
[]  한 개의 문자 예) [abc] a,b,c 중 하나의 문자
     [09] 0~9 중 하나의 숫자
{} 반복 개념 예) {6} 6번 반복
\w  한 개의 알파벳 또는 한 개의 숫자 예) [A-Za-z0-9]와 동일한 의미의 메타 문자
+ 한 개 이상  
()  그룹핑(grouping)  
?
없음 또는 한 개  

 [사례] String regex = "^[0-9]{6}-[1234][0-9]{6}$";

 

 

 * 이메일 유형
  #  개인 메일 : king5901@naver.com
       kim1234@gmail.com
  #  회사 직원 메일 : erin0521@partner.sk.com
    spec@ora.co.kr
 
  ※ 이메일 패턴
   "^\\w+@\\w+\\.\\w+(\\.\\w+)?"

 

 

 

 

 소스 코드

package 주민번호로부터정보추출;

import java.util.*;

public class JuminCheckEx {
	public static void main(String[] args) {
		// 준비 단계 : 필요 변수, 배열의 초기화
		
		String juminNum;
		int sum = 0; // 누계 변수는 0으로 초기화
		int[] weight = {2,3,4,5,6,7,0,8,9,2,3,4,5}; // 가중치 배열 초기화
		int temp, result;
		
		// 입력 단계
		System.out.println("주민번호 입력  >>> ");
		Scanner scan = new Scanner(System.in);
		juminNum = scan.next(); // 문자열로 입력 받음 => '-' 포함하여 입력
		
		/*
		 *  입력받은 주민번호를 유효성 검사 => 정규 표현식(regex) 패턴 적용
		 */
		String regex = "^[0-9]{6}-[1234][0-9]{6}$"; // 주민번호 정규 표현식 패턴
		// 대괄호 안 = 메타문자 - 특별한 문자를 가지고있는 문자  ==> 범위 : 0-9까지
		// 중괄호 반복횟수 ==> 6번 반복해라
		
		// 첫번째 방법
		//boolean check = Pattern.matches(regex, juminNum);
		
		// 두번째 방법
		boolean check = juminNum.matches(regex);
		
		if(check == false) {
			System.out.println("입력된 주민번호는 정규 표현식 형식에 맞지 않음!");
		}else {
			System.out.println("입력된 주민번호는 정규 표현식에 적합함!");
		}
		
		/*
		 * 입력받은 주민번호에 체크 공식 적용
		 */
		// 1단계 적용 => sum 구하기
		for(int i=0; i<13; i++) {
			if(juminNum.charAt(i) == '-')continue;
				sum += (juminNum.charAt(i)-48) * weight[i];
				/*
				 *  -48 빼주는 이유 
				 *  
				 *  주민번호 : 971024 -
				 *  	'9''7'
				 *  	(57=48) * 2 = 9 * 2 = 18
				 *  ASCII 코드 값
				 *   '0' : 48
				 *   '1' : 49
				 */
		}
		// System.out.println(sum);
		
		// 2단계 공식 => temp 값이 두 자리인 경우가 있다. 10 or 11
		temp = 11 - (sum%11);
		
		// 3단계 공식 => temp 값이 두 자리인 주민번호를 대비해서..
		result = temp%10;
		
		// 주민번호 정상 유무 체크
		if(result == juminNum.charAt(13)-48) {
			System.out.println("입력된 주민번호가 정상입니다.");
			/*
			 * 	1. 현재 시스템으로부터 년도 얻어내기 => 2021
				2. 주민번호 앞 자리의 생년월일에서 년도 두자리만 얻어오기 => "97" => 97 정수값으로 변환
				3. 주민번호 뒤 자리의 첫번째 자리 1,2,3,4 중 어느 것인지 비교 판단하여
	   				if 1,2 면은 1900을 더해주고 => 1900
	      			3,4면    2000을 더해준다.
				4. 2021 - 1997 = 나이
			 */
			
			// [힌트] Calendar 클래스 적용
			Calendar cal = Calendar.getInstance(Locale.KOREA);
			int year = cal.get(Calendar.YEAR);  // 2021 얻어옴
			
			int yy = Integer.parseInt(juminNum.substring(0,2));  // "97" => 97변환
			
			if((juminNum.charAt(7)-48) < 3) { // 1,2 인 경우면
				yy = yy + 1900; // 97 + 1900 = 1997
			}else {		// 3,4인 경우
				yy = yy + 2000;
			}
			int age = year - yy + 1; // 본 나이
			System.out.println(age);
			
			// "성별" 추출
			if((juminNum.charAt(7)-48) % 2 == 0) { // 2, 4인 경우
				System.out.println("성별 : 여자");
			}else {	// 1, 3 인 경우
				System.out.println("성별 : 남자");
			}
			// "출신지역" 추출
			// 지역코드를 2차원 배열로 초기화
			String[][] localeCode = {{"서울","00","08"},{"부산","09","12"},{"인천","13","15"},
									{"경기","16","26"},{"강원","26","34"},{"충북","35","39"},
									{"대전","40","40"},{"충남","41","43"},{"세종","44","44"},
									{"세종","96","96"},{"전북","48","54"},{"전남","55","64"},
									{"광주","65","66"},{"대구","67","70"},{"경북","71","80"},
									{"경남","81","81"},{"경남","86","90"},{"울산","85","85"},{"제주","91","95"}};
			String localeString = juminNum.substring(8,10);
			
			int locale = Integer.parseInt(localeString);
			String birthPlace = null;

			for(int j=0;j<=19;j++){
				if(locale >= Integer.parseInt(localeCode[j][1]) && 
						locale <= Integer.parseInt(localeCode[j][2])) {
					birthPlace = localeCode[j][0];
				}
			}
			System.out.println("출신 지역은 "+birthPlace+"입니다.");
			
			// "생년월일" 추출
			System.out.println("생년월일 : " + yy + "/" + juminNum.substring(2, 4) + "/" + juminNum.substring(4,6));
			
			// "띠" 추출
			String ddi = null;
			String[] gangi = {"원숭이","닭","개","돼지","쥐","소","범","토끼","용","뱀","말","양"};
			ddi = gangi[yy%12];
			System.out.println("띠 "+ ddi);
		}else {
			System.out.println("입력된 주민번호가 틀린 번호 입니다.");
		}
	}
}
반응형