Last active
July 8, 2023 09:47
-
-
Save YongWanJin/e9d9b4b8f3d85edfc48993d3854918b2 to your computer and use it in GitHub Desktop.
제로베이스 백엔드 1주차 미니과제 4번
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
진용완 | |
제로베이스 백엔드 스쿨 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