본문 바로가기

Backend/Java

[JAVA] 주민등록번호 검증 프로그램

728x90

# 콘솔용으로 간단한 주민등록번호 검증 기능을 만들어 보았다.

 

1) 길이 검증

2) 숫자 포맷 검증

3) 주민등록번호 마지막 숫자(검증번호)를 이용한 검증

 


class RegistrationNumberVerficationManager {
	private String input;
	private int totalCount;
	private int correctCount;
	private int errorCount;
	private int abnormalCount;

	private Scanner sc = new Scanner(System.in);

	// 생성자
	public RegistrationNumberVerficationManager() {
		start();
	}

	// 시작해주는 함수
	private void start() {
		System.out.println("==============================");
		System.out.println(" 미래크립토 주민번호 검증 및 집계 프로그램 ");
		System.out.println("               -홍길동 ");
		System.out.println("==============================\n\n");
		System.out.println("* 주민번호 입력 (oooooo-ooooooo 하이픈 포함 14자리, exit 입력시 종료)\n");

		// count 관련 초기화 시켜주기.
		totalCount = 0;
		correctCount = 0;
		errorCount = 0;
		abnormalCount = 0;

		// while문을돌면서 반복한다.
		while (true) {
			System.out.print(">> 데이터 입력: ");
			input = sc.nextLine();
			totalCount++;

			// 검증메서드 실행
			verify(input);
		}
	}

	// 검증 메서드.
	private void verify(String input) {
		// 주민등록번호 검증
		// 1. 주민번호 수치상의 오류
		// 2. 길이 문제
		// 3. 정상적인주민번호 인경우 - 출력
		// 4. exit -> 종료 및 결과 출력

		// exit입력 - 비정상입력
		if (input.equals("exit")) { // exit도 비정상 입력에 포함됨.
			abnormalCount++;
			stop();
		}
		int length = input.length();

		// 길이검증
		if (length != 14) {
			System.out.println("주민번호는 oooooo-ooooooo 하이픈 포함 14자리 입니다.\n");
			abnormalCount++;
			return;
		}
		input = input.replace("-", "");
		input.trim();
		int[] index = new int[13];
		String[] tmp = input.split("");

		// 숫자포멧 검증
		for (int i = 0; i < 13; i++) {
			try {
				index[i] = Integer.parseInt(tmp[i]);
			} catch (NumberFormatException e) {
				System.out.println("-을 제외하고 모두 0 ~ 9 숫자이어야 합니다.\n");
				abnormalCount++;
				return;
			}
		}
		// 검증번호를 이용한 검증
		int[] check = { 2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5 };
		int sum = 0;
		for (int i = 0; i < 12; i++) {
			sum += check[i] * index[i];
		}
		if (index[12] == ((11 - sum % 11) % 10)) {
			System.out.println("[검증 성공] 정상적인 주민번호이며 오류가 없습니다! \n");
			correctCount++;
			return;
		} else {
			System.out.println("[검증 실패] 주민 번호 수치상의 오류가 있습니다. \n");
			errorCount++;
			return;
		}
	}

	// exit하는 경우 출력하는함수.
	private void stop() {
		System.out.println("\n\n------------------------------");
		System.out.println("* 최종결과:  ");
		System.out.println("   -총 입력 건수: " + totalCount + "건");
		System.out.println("   -정상 주민번호: " + correctCount + "건 (" + convertPercentage(correctCount)+"%)");
		System.out.println("   -오류 주민번호: " + errorCount + "건 (" + convertPercentage(errorCount)+"%)");
		System.out.println("   -비정상 입력: " + abnormalCount + "건 (" + convertPercentage(abnormalCount)+"%)");
		System.out.println("==============================");

		// 시스템 종료
		sc.close();
		System.exit(0);
	}

	// 백분율 소수점 둘째짜리까지 환산해주는 메서드
	private String convertPercentage(int count) {
		double result = 0.0;
		result = Math.round((double)(count / totalCount) * 100);
		String resultStr = String.format("%.2f", result);
		return resultStr;
	}
}

public class Main {
	public static void main(String[] args) {
		new RegistrationNumberVerficationManager();
	}
}

실행 결과

 

728x90