Skip to content

Instantly share code, notes, and snippets.

@YongWanJin
Last active July 8, 2023 09:47
Show Gist options
  • Save YongWanJin/e9d9b4b8f3d85edfc48993d3854918b2 to your computer and use it in GitHub Desktop.
Save YongWanJin/e9d9b4b8f3d85edfc48993d3854918b2 to your computer and use it in GitHub Desktop.
제로베이스 백엔드 1주차 미니과제 4번
/*
진용완
제로베이스 백엔드 스쿨 15기
*/
import java.util.ArrayList;
import java.util.InputMismatchException;
import java.util.*;
import java.util.Scanner;
import java.util.regex.Pattern;
import java.util.Random;
class ExceptionNotYear extends RuntimeException{}
class ExceptionNotMonth extends RuntimeException{}
class ExceptionNotDay extends RuntimeException{}
class ExceptionNotGender extends RuntimeException{}
class MakeRegNum {
// [ 변수 ]
int year;
String month;
String day;
String gender;
String randomNum = " "; // 뒷자리의 5자리 임의의숫자
String regNum = " "; // 주민등록번호
Scanner sc;
// [ 상수 ]
// : 적절한 형식이 아닌 입력값을 거르기 위한 정규표현식과 콜렉션들
static String REGEXP_MONTH0 = "^0[1-9]$";
static String REGEXP_MONTH1 = "^1[0-2]$";
static String REGEXP_DAY = "^[0-3][0-9]";
static ArrayList<String> MONTH_ODD = new ArrayList<>(Arrays.asList("01","03","05","07","08","10","12"));
static ArrayList<String> MONTH_EVEN = new ArrayList<>(Arrays.asList("04","06","09","11"));
// [ 메서드 ]
// # 사용자 정보 입력받는 메서드
public void getInput(){
System.out.println("[주민등록번호 계산]");
// 출생년도 입력
while(true){
System.out.print("출생년도를 입력해 주세요.(yyyy):");
sc = new Scanner(System.in);
try{
year = sc.nextInt();
// 출생년도 형식이 아닌 입력값 거르기
if (year<2020 | year>9999){
throw new ExceptionNotYear();}
} catch (InputMismatchException | ExceptionNotYear e) {
continue;
} break;
}
// 출생월 입력
while(true){
System.out.print("출생월을 입력해 주세요.(mm):");
sc = new Scanner(System.in);
try {
month = sc.nextLine();
// 출생월 형식이 아닌 입력값 거르기
if(!(Pattern.matches(REGEXP_MONTH0, month) | Pattern.matches(REGEXP_MONTH1, month))){
throw new ExceptionNotMonth();
}
} catch (ExceptionNotMonth e) {
continue;
} break;
}
// 출생일 입력
while(true){
System.out.print("출생일을 입력해 주세요.(dd):");
sc = new Scanner(System.in);
try {
day = sc.nextLine();
// 출생일 형식이 아닌 입력값 거르기
if (!Pattern.matches(REGEXP_DAY, day) | Pattern.matches("^00$", day)) {
throw new ExceptionNotDay();
}
if (MONTH_ODD.contains(month)){
if (Pattern.matches("^3[2-9]$", day)){
throw new ExceptionNotDay();
}
} else if (MONTH_EVEN.contains(month)){
if (Pattern.matches("^3[1-9]$", day)){
throw new ExceptionNotDay();
}
} else if (month.equals("02")){
if (Pattern.matches("^3[0-9]$", day)){
throw new ExceptionNotDay();
}
}
} catch (ExceptionNotDay e){
continue;
} break;
}
// 성별 입력
while(true){
System.out.print("성별을 입력해 주세요.(m/f):");
sc = new Scanner(System.in);
try {
gender = sc.nextLine();
// 성별 형식이 아닌 입력값 거르기
if (!(gender.equals("m")|gender.equals("f"))){
throw new ExceptionNotGender();
}
} catch(ExceptionNotGender e){
continue;
} break;
}
}
// # 주민등록번호 생성하는 메서드
public void makeRegNum(){
// 연도를 문자열로 변환
String yearStr = Integer.toString(year);
// 성별을 숫자로 된 문자열로 변환
if (gender.equals("m")){
gender = "3";
} else {
gender = "4";
}
// 주민번호 뒷자리 5자리 랜덤 번호 생성
Random r = new Random(System.nanoTime());
for(int i=0; i<6; i++){
randomNum += Integer.toString(r.nextInt(10));
}
randomNum = randomNum.trim();
// 이제 모든 값들을 주민등록번호로 결합
regNum = yearStr.substring(2) + month + day + "-" + gender + randomNum;
// 생성 결과 출력
System.out.println(regNum);
}
}
// 메인부
public class Mini4RegNum {
public static void main(String[] args) {
MakeRegNum rn = new MakeRegNum();
rn.getInput();
rn.makeRegNum();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment