일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- jsp 날짜팝업
- 정보처리기사실기정리
- spring crud
- 프로그래머스 MYSQL
- 2020정보처리기사실기정리
- 정처기실기정리
- 스프링 crud
- 스프링 CRUD게시판
- 2020정보처리기사실기
- jsp게시판만들기
- crud게시판
- 프로그래머스 쿼리문
- 날짜지정팝업
- 오버라이딩
- 게시판만들기
- 자바배열예제
- html기초
- CRUD게시판만들기
- 2020정보처리기사실기요약
- 스프링게시판만들기
- 자바연산자
- 자바 정규표현식 예제
- Oracle기초
- 오라클설치
- spring crud게시판
- PLSQL
- 프로그래머스 SQL
- 자바기초
- js datepicker
- jsp 팝업띄우기
Archives
- Today
- Total
영보의 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("입력된 주민번호가 틀린 번호 입니다.");
}
}
}
반응형
'국비교육(아이티센 입사교육) > Java' 카테고리의 다른 글
[Java] 자바 로또 프로그램 만들기 ( HashSet, Treeset) (0) | 2021.09.28 |
---|---|
[Java] Java 컬렉션 개요와 종류 / 예제 (0) | 2021.09.28 |
[Java] 자료구조 / 알고리즘 / java컬렉션 / java컬렉션 예제 (0) | 2021.09.28 |
[Java] Java / 데이터 타입 / 변수 종류 / 연산자의 종류 / 기본 API 클래스 or 인터페이스 / String 클래스의 사용 빈도수가 높은 메소드 (0) | 2021.09.27 |
[Java] lastIndexOf 와 substring 문자열 자르기 (0) | 2021.09.27 |