본문 바로가기
풀스택 개발 학습 과정/백엔드(Java, Spring)

[자바] String 예제 - 주민번호 검증 프로그램

by 육츠 2024. 1. 29.
Contents 접기

문제

키보드로부터 주민번호를 입력 받아 올바른 주민번호인지 판단하고 주민번호로부터 정보를 추출하여 출력하는 코드를 작성하시오.

검증 내용

-  다음 페이지를 참고하여 사용자 정의 메소드를 확인하고 필요한 메소드를 작성할 것.
-  주민번호는 “-“ 포함 14자리여야 한다.
-  생년월일 뒤에 “-“이 포함되어 있어야 한다.
-  “-“ 앞과 뒤에는 숫자 리터럴만 가능하다.
-  성별에 해당하는 8번째 위치는 1~4까지의 값만 가능 (1, 3:남자, 2, 4: 여자)
-  검증 코드는 아래의 알고리즘으로 구현하여 확인
-  문자열과 관련된 다양한 메소드를 이용하여 작업한다.

 

main

public class juminIDValid {

	public static void main(String[] args) {
		String jumin = null;
		String gender = null,year, month, day;
		int age = 0;

		Scanner scanner = new Scanner(System.in);

		System.out.print("주민번호를 입력하세요 >> ");
		jumin = scanner.next();

		String[] tmp = jumin.split("-");

		if(!(isNumeric(tmp[0]) && isNumeric(tmp[1]))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}

		if(!(isValid(jumin))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}

		if(!(codeCheck(jumin))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}
		
		// 여기까지 오면 올바른 주민번호이므로 성별을 체크한다.
		gender = genderCheck(jumin);
		
		year = birthYear(jumin);
		month = jumin.substring(2,4);
		day = jumin.substring(4,6);
		age = 2024 - Integer.parseInt(year);
		
		//출력
		System.out.println("당신은" + year +"년/ " + month +"월/ "+ day +
				"일생. 나이는 " + age + "세, " + gender + "입니다.");
		


		scanner.close();

	}

 

‘-‘ 위치에 문자열이 올바르게 포함되어 있는지 체크하고, 성별의 범주가 1~4까지인지 체크

	private static boolean isValid(String jumin){
		boolean flag1 = false; // '-' 체크
		boolean flag2 = false; // 성별체크
		
		char gender = jumin.charAt(7);

		if( jumin.charAt(6) == '-') flag1 = true; 
		if(gender >= '1' && gender <= '4') flag2 = true;
		
		
		return flag1 && flag2; // 둘다 true 일때만 true 가 나가도록
	}

 

주민번호를 전달받아 검증코드 알고리즘으로 올바른 주민번호인지 체크   ****

	private static boolean codeCheck(String jumin) {
		int total = 0;
		int tmp = 0;
		int value = 2;
		
		for(int i = 0; i<jumin.length()-1; i++) {
			if(i ==6) continue;
			tmp = jumin.charAt(i) - '0'; // '1' - '0' = 1
			total += (tmp * value);
			++value;
			
			if(value ==10) value =2;

		}
		// 나머지 = 합계를 11로 나눈 나머지, 코드값 = 11-나머지
		// 마지막 결과가 2자리인 경우 다시 10으로 나눈 나머지 값으로 검증을 한다.

		int digit = jumin.charAt(jumin.length() -1) -'0'; // 검증값 : 주민번호 끝자리
		int valid = 11 - (total % 11);
		if (valid>9) valid = valid % 10;
		
		System.out.println("끝자리" + digit + " , " + valid);
		if(digit == valid) return true;
		
		return false;
				
	}
코드 의미
tmp = jumin.charAt(i) - '0'; 연산 가능한 수로 변환 시키는 것이다.
예 :  '1' - '0' = 1

 

‘-‘앞과 위에 숫자로만 되어 있는지 체크

public static boolean isNumeric(String temp) {
	for(int i = 0; i < temp.length(); i++) {

		if(!( temp.charAt(i) >= '0'&& temp.charAt(i) <= '9'))
			return false;
	}

	return true;
}

 

전달받은 주민번호로 1, 3이면 “남자”, 2, 4면 “여자”라는 문자열 반환

private static String genderCheck(String jumin) {
		
		if((jumin.charAt(7) - '0') %2 ==0 ) //일반 숫자로 변경
			return "여자";
		return "남자";
	}

 

 

+ 추가 기능(Option) - 생년을 확인하여 평년인 경우 0229가 입력되면 Fail 처리한다.

주민번호를 입력 : 210229-3123445
­윤년인데, 2월 29일 OK­ 
평년인데, 2월 29일 Fail

 

+ 전체 코드

더보기

 

package api;

import java.util.Scanner;

public class juminIDValid {

	public static void main(String[] args) {
		String jumin = null;
		String gender = null,year, month, day;
		int age = 0;

		Scanner scanner = new Scanner(System.in);

		System.out.print("주민번호를 입력하세요 >> ");
		jumin = scanner.next();

		String[] tmp = jumin.split("-");

		if(!(isNumeric(tmp[0]) && isNumeric(tmp[1]))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}

		if(!(isValid(jumin))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}

		if(!(codeCheck(jumin))) {
			System.out.println("올바르지 않은 주민번호입니다.");
			return;
		}
		
		// 여기까지 오면 올바른 주민번호이므로 성별을 체크한다.
		gender = genderCheck(jumin);
		
		year = birthYear(jumin);
		month = jumin.substring(2,4);
		day = jumin.substring(4,6);
		age = 2024 - Integer.parseInt(year);
		
		//출력
		System.out.println("당신은" + year +"년/ " + month +"월/ "+ day +
				"일생. 나이는 " + age + "세, " + gender + "입니다.");
		


		scanner.close();

	}

	// 주민번호를 전달받아 검증코드 알고리즘으로 올바른 주민번호인지 체크
	private static boolean codeCheck(String jumin) {
		int total = 0;
		int tmp = 0;
		int value = 2;

		for(int i = 0; i<jumin.length()-1; i++) {
			if(i ==6) continue;
			tmp = jumin.charAt(i) - '0'; // '1' - '0' = 1
			total += (tmp * value);
			++value;

			if(value ==10) value =2;

		}
		// 나머지 = 합계를 11로 나눈 나머지, 코드값 = 11-나머지
		// 마지막 결과가 2자리인 경우 다시 10으로 나눈 나머지 값으로 검증을 한다.

		int digit = jumin.charAt(jumin.length() -1) -'0'; // 검증값 : 주민번호 끝자리
		int valid = 11 - (total % 11);
		if (valid>9) valid = valid % 10;

		System.out.println("끝자리 : " + digit + " , " + valid);
		if(digit == valid) return true;

		return false;

	}

	private static String birthYear(String jumin) {
		String birth = null;
		
		char gender = jumin.charAt(7);
		
		if(gender == '1' || gender == '2') {
			birth = "19";
		} else {
			birth = "20";
		}
		
		return birth + jumin.substring(0,2);
	}
	
	// 전달받은 주민번호로 1, 3이면 “남자”, 2, 4면 “여자”라는 문자열 반환

	private static String genderCheck(String jumin) {
		/*
		 * String gender = null;

		if (jumin.charAt(7) == '1' | jumin.charAt(7)=='3') {
			gender = "남자"; 
		} else {
			if (jumin.charAt(7) == '2' | jumin.charAt(7)=='4')
				gender = "여자";
		}

		return gender; */
		
		if((jumin.charAt(7) - '0') %2 ==0 ) //일반 숫자로 변경
			return "여자";
		return "남자";
	}

	// ‘-‘ 위치에 문자열이 올바르게 포함되어 있는지 체크하고, 
	// 성별의 범주가 1~4까지인지 체크
	private static boolean isValid(String jumin){
		boolean flag1 = false; // '-' 체크
		boolean flag2 = false; // 성별체크

		char gender = jumin.charAt(7);

		if( jumin.charAt(6) == '-') flag1 = true; 
		if(gender >= '1' && gender <= '4') flag2 = true;


		return flag1 && flag2; // 둘다 true 일때만 true 가 나가도록
	}



	public static boolean isNumeric(String temp) {
		for(int i = 0; i < temp.length(); i++) {

			if(!( temp.charAt(i) >= '0'&& temp.charAt(i) <= '9'))
				return false;
		}

		return true;
	}


}