h-i-s-t-o-r-y

[Java] 주민등록번호 입력받아 남녀, 내외국인, 출생지, 검증하기 본문

Java

[Java] 주민등록번호 입력받아 남녀, 내외국인, 출생지, 검증하기

H' 2021. 7. 16. 11:39
package days09;

import java.util.Scanner;

public class Ex05 {

	public static void main(String[] args) {
		// ㄱㄴㄷㄹㅁㅂ - [ㅅ]ㅇㅈㅊㅋㅌㅍ
		// 성별, 내/외국인, 세기
		
		String rrn;
		rrn = getRRN();		//입력예) 891223-1700001
		
		System.out.printf("> RRN : %s\n", rrn);
		
		// 1. 성별 boolean형 (조건식에 쉽게 사용하기 위해)
		boolean gender = getGender(rrn);
		if (gender) {
			System.out.println("남자");
		} else {
			System.out.println("여자");
		}
		
		
		
		// 2. 내/외국인
		if ( isforeigner(rrn) ) {
			System.out.println("외국인");
		} else {
			System.out.println("내국인");
		}
		
		
		// 3. 세기 int getCentury(rrn)
		// 1800년대 / 1900년대 / 2000년대
		System.out.printf("%d년대", getCentury(rrn));
		
		
	}//main

	
	private static int getCentury(String rrn) {
		char ㅅ = rrn.charAt(7);
		switch (ㅅ-48) {
		case 1: case 2: case 5: case 6: return 1900;
		case 3: case 4: case 7: case 8: return 2000;		
		} return 1800;
	}//세기


	private static boolean isforeigner(String rrn) {
		char ㅅ = rrn.charAt(7);
		switch (ㅅ) {
		case '5': case '6': case '7': case '8': return true;
		}	return false;
		
	}//내외국인


	public static boolean getGender(String rrn) {
		char ㅅ = rrn.charAt(7);
		return (ㅅ - 48) % 2 == 1? true: false;
		
		/*
		switch (ㅅ - 48) {	//'1' 문자-48 -> 숫자1
		case 9: case 1: case 3: case 5: case 7: return true;
		default: return false;
		}
		*/
		
	}//성별


	// 주민번호 입력받기
	// 유효성검사		\d{6}-\d{7}
	public static String getRRN() {
		String rrn;
		String regex = "\\d{6}-\\d{7}";
		boolean flag=false;
		
		do {
			if (flag) System.out.println("> 올바른 주민번호가 아닙니다.");
			System.out.print("> 주민번호 입력 ? ");
			Scanner scanner = new Scanner(System.in);
			rrn = scanner.nextLine();
		} while (flag = !rrn.matches(regex));
		
		return rrn;
	}//주민번호 입력+유효성검사

	
	
}//class




// 주민번호를 입력받아서..		ㅅ만 알면
// 								1. 성별
// 2. 생년월일(생일)
// 								3. 세기
// 4. 출생지역
// 								5. 내/외국인
// 6. 검증
// 7. 나이

// Resident Registration Number, RRN
// ㄱㄴㄷㄹㅁㅂ - ㅅㅇㅈㅊㅋㅌㅍ
// 1) ㄱㄴㄷㄹㅁㅂ 생년월일
// 2) ㅅ 성별
// 3) ㅇㅈㅊㅋ 지역
// 4) ㅌ 신고순번

//검증
//ㅍ = 11-{(2×ㄱ+3×ㄴ+4×ㄷ+5×ㄹ+6×ㅁ+7×ㅂ+8×ㅅ+9×ㅇ+2×ㅈ+3×ㅊ+4×ㅋ+5×ㅌ) mod 11}
package days10;

import java.util.Date;

import days09.Ex05;

public class Ex02 {

	public static void main(String[] args) {
		String rrn;		//980131-2192224
		rrn = Ex05.getRRN();
		boolean gender = Ex05.getGender(rrn);
		System.out.println( gender ? "남자" : "여자" );
		
		int century = getCentury(rrn);
		System.out.printf("%d년\n", century);
		
		// 주민등록번호 로부터 생년월일 출력		(18/19/20)98 01월 31일 생
		String birthday =  getBirthday(rrn);
		System.out.println( birthday );
		
		// 나이
		// 1) 세는 나이 : 새해 1월 1일이 되면 1살 증가
		// 2) 만 나이 :  태어나면 0세 1년이 되어 생일이 지나면 1살 증가
		
		// 만나이를 반환하는 메서드
		int age = getAge(rrn);
		System.out.printf("만 %d세 입니다.\n", age);
		
		
		
	}//main
	
	private static int getAge(String rrn) {
		// 기준일은 오늘날짜(2021.03.19)로 ...
		Date d = new Date();
		
		int year = Integer.parseInt(rrn.substring(0, 2));
		int century = getCentury(rrn);
		year += century;
		int thisYear = d.getYear()+1900;
		// 세는 나이 = thisYear - year + 1
		int age = thisYear - year - 1;
		
		// 생일 지났는지 여부 처리.. +1
		// 월+일 정수형
		// 1231     <=     319     +1코딩
		int t_monthday = (d.getMonth()+1)*100 + d.getDate();
		int b_monthday = Integer.parseInt(rrn.substring(2, 6));
		if (t_monthday>=b_monthday) {
			age++;
		}
		return age;
		
	}//getAge





	private static String getBirthday(String rrn) {
		int year = Integer.parseInt(rrn.substring(0, 2));
		int month = Integer.parseInt(rrn.substring(2, 4));
		int day = Integer.parseInt(rrn.substring(4, 6));
		int century = getCentury(rrn);
		year += century;
		
		String birthday = String.format("출생년도 : %d년 %02d월 %02d일\n", year, month, day);
		return birthday;
	}





	public static int getCentury(String rrn) {
		int ㅅ = rrn.charAt(7) - 48;
		int century;
		
		switch (ㅅ) {
		case 0: case 9: century = 1800; break;
		case 1: case 2: case 5: case 6: century =1900; break;
		default: century = 2000; break;
		}
		
		return century;
	}
	
	
}//class
package days10;

public class Ex02_02 {

	public static void main(String[] args) {
		String rrn = "980131-2192224";
		// 				98 출생년도
		// 					01 출생월
		// 						31 출생일
		// charAt 한문자 말고 여러개의 문자 가져오기
		// String.substring() 메서드
		// 문자열 속에서 내가 원하는 문자열을 String 형태로 읽어오는 함수
		
		String year = rrn.substring(0, 2);		// (비긴인덱스~엔드인덱스-1) 자리의 문자를 읽어옴
		String month = rrn.substring(2, 4);
		String day = rrn.substring(4, 6);
		System.out.printf("출생년도 : %s년 %s월 %s일\n", year, month, day);
		
		// endIndex 를 설정하지 않으면 문자열 끝까지를 읽어옴
		System.out.println(rrn.substring(7));
		// 문자열 연결 연산자 +
		String chgrrn = rrn.substring(0,8) + "******";
		// 문자열 연결 메서드 String.concat()
		String chgrrn2 = rrn.substring(0,8).concat("******") ;
		
		System.out.println(chgrrn);
		System.out.println(chgrrn2);
		
	}

}
package days10;

import java.util.Date;

import javax.xml.crypto.Data;

public class Ex02_03 {

	public static void main(String[] args) {
		// Date 클래스 - 날짜 정보
		Date d = new Date();
		// Fri Mar 19 14:15:00 KST 2021
		// System.out.println(d);
		
		//Deprecated 삭제될 함수
		int year = d.getYear();
		System.out.println(year+1900);		//2021-1900 = 121
		
		int month = d.getMonth();
		System.out.println(month+1);		//0(1월)~11(12월) -> 2(3월)
		
		int day = d.getDate();
		System.out.println(day);				//날짜는 잘 나옴
		
		
	}//main

}//class
package days10;

public class Ex03 {

	public static void main(String[] args) {
		
		String rrn = "980131-2192224";
		
		if (isRRNCheck(rrn)) {
			System.out.println("올바른 주민등록번호입니다.");
		} else {
			System.out.println("잘못된 주민등록번호입니다.");
		}
		
		
	}//main

	private static boolean isRRNCheck(String rrn) {
		// ㄱㄴㄷㄹㅁㅂ - ㅅㅇㅈㅊㅋㅌㅍ
		// ㅍ = 11-{(2×ㄱ+3×ㄴ+4×ㄷ+5×ㄹ+6×ㅁ+7×ㅂ+8×ㅅ+9×ㅇ+2×ㅈ+3×ㅊ+4×ㅋ+5×ㅌ) mod 11}
		// ㅍ=10 -> 1         ㅍ= 11->0
		
		
		// 쌤이한거
		int tot = 0;
		int [] m = {2,3,4,5,6,7,0,8,9,2,3,4,5};
		
		for (int i = 0; i < m.length; i++) {
			tot += (rrn.charAt(i)-48)*m[i];
		}
		int ㅍ = 11- (tot % 11);
		
		if(ㅍ==10) ㅍ=1;
		else if(ㅍ==11) ㅍ=0;
		
		int ㅎ = rrn.charAt(13) - 48;
		
		return ㅍ==ㅎ;
		
		
		
		/* 직관적으로
//		int ㄱ = Integer.parseInt(rrn.substring(0, 1));
		int ㄱ = rrn.charAt(0) - 48;
		int ㄴ = rrn.charAt(1) - 48;
		int ㄷ = rrn.charAt(2) - 48;
		int ㄹ = rrn.charAt(3) - 48;
		int ㅁ = rrn.charAt(4) - 48;
		int ㅂ = rrn.charAt(5) - 48;
		// '-' 6
		int ㅅ = rrn.charAt(7) - 48;
		int ㅇ = rrn.charAt(8) - 48;
		int ㅈ = rrn.charAt(9) - 48;
		int ㅊ = rrn.charAt(10) - 48;
		int ㅋ = rrn.charAt(11) - 48;
		int ㅌ = rrn.charAt(12) - 48;
		
		int ㅍ = 11- ((2*ㄱ+3*ㄴ+4*ㄷ+5*ㄹ+6*ㅁ+7*ㅂ+8*ㅅ+9*ㅇ+2*ㅈ+3*ㅊ+4*ㅋ+5*ㅌ) % 11);
		
		if(ㅍ==10) ㅍ=1;
		else if(ㅍ==11) ㅍ=0;
		
		int ㅎ = rrn.charAt(13) - 48;

		return ㅍ==ㅎ;
		*/
		
		
		
		
		/*내가한거
		int mul;
		int sum = 0;
		for (int i = 2, j = 0; j < rrn.length()-1 ; j++) {
			if (j==6) continue;
			mul = i*Integer.parseInt(rrn.substring(j, j+1));
			sum += mul;
			if (i==9) i=1;
			i++;
		}
		int ㅍ = 11- (sum % 11);
		
		//10이랑 11처리안함 ㅜㅜ
		
		if (ㅍ == Integer.parseInt(rrn.substring(13)) ) return true;
		else return false;
		*/
		
	}//check
	
	

}//class
Comments