Java

Calendar 클래스를 이용해 주민번호를 통해 나이 구하기

나루나른 2024. 3. 24. 13:14

입력된 주민번호 : '891230 - 1234567' 에 대한 유효성 검증 및 해당 주민번호를 바탕으로 개인의 생년월일, 성별, 나이, 띠 그리고 살아온 날수를 계산하여 출력하는 문제

 

class Jumin {
	//주민번호를 다루는 클래스
    private String juminno; //주민번호를 저장하기 위한 문자열 변수(외부에서 직접 접근 불가)

    public Jumin() {//기본생성자 에러 발생을 방지하기 위한 기본 선언만 해둔 상태(동작x)

    }

    public Jumin(String juminno) {
        this.juminno = juminno;//주민번호를 매개변수로 받아 해당 변수를 초기화한다.
    }

    public boolean isValidate() {
        boolean flag = false;//주민번호 유효성을 검사하는 메소드(유효 true, 아니면 false를 반환)
			//주민번호가 맞다면 flag 변수값을 true를 대입
        
        //CheckNum 배열의 경우 주민등록번호의 유효성을 검사하기 위한 공식에서 사용되는 가중치 값들을 저장한 배열이다.
        Integer[] CHECKNUM = {2, 3, 4, 5, 6, 7, 8, 9, 2, 3, 4, 5};
        
        Integer[] save = new Integer[12]; //CHECKNUM의 곱한 값을 저장하는 배열
        int size = save.length; //save 배열의 길이를 저장함
        int hap = 0;//곱한 값들의 합을 저장하는 변수로 초기값을 0으로 할당함

        //입력 받은 주민번호의 값을 한자리 씩 순회하여
        for (int i = 0; i < size; i++) {
            // 주민번호에서 한 글자씩 가져와서 정수형으로 변환
            int num = Integer.parseInt(juminno.substring(i, i + 1));
            save[i] = num * CHECKNUM[i]; //각 자리의 값을 CheckNum 배열의 값과 곱하고 save 배열에 저장함 
            hap += save[i]; //save 배열에 저장된 값을 hap 변수에 누적한다.
        }

        // 오류 검증 번호(주민번호의 마지막 검증 번호를 구하기 위한 과정)
        int M = (11 - (hap % 11)) % 10;//누적된 hap 변수의 값에 11을 뺀후 다시 10으로 나눈 나머지를 계산
        
        // 오류 검증번호와 주민번호 마지막 글자와 같은지
        // 계산된 검증번호(M)과 마지막 주민번호의 숫자가 같다면 flag를 true로 설정하고 그 값을 반환함
        if (M == Integer.parseInt(juminno.substring(12))) {
            flag = true;
        }
        return flag;
    }

    public void disp() {
   
    	/* 
    	 생년월일 : 1989년 12월 30일
    	 성별 : 남자
    	 나이 : 35 ->그레고리안 캘린더 클래스 이용
    	 -> 태어난 % 12(0원숭이 1닭 2 개 ~~ 11양)
    	 살아온 날수 12500일 
    	 */
    	
    	GregorianCalendar now = new GregorianCalendar();
    	int cYear = now.get(Calendar.YEAR);//2024
    	
    	//성별 코드 "1" -> 1
        //주민번호의 7번째 자리(성별을 나타내는 코드)를 추출한다.
    	int myCode = Integer.parseInt(juminno.substring(6,7));
    	
    	//태어난 년도, 태어난 월, 태어난 일을 저장핣 변수를 선언하고 초기값을 0으로 할당
        // 주민번호에서 각각 태어난 년도, 월, 일등을 추출함
    	int myYear = 0, myMonth = 0, myDate =0;
    	myYear = Integer.parseInt(juminno.substring(0,2));//89
    	myMonth = Integer.parseInt(juminno.substring(2,4));//12
    	myDate = Integer.parseInt(juminno.substring(4,6));//30
    	
        
    	//주민번호 7번째 자리의 값이 1,2일 경우 1900년대에 태어난 사람이라는 것을 의미하고
        //3,4일 경우 2000년대에 태어난 사람을 의미한다. 이를 기반으로 실제 출생년도를 계산해 myYear 변수에 저장함
    	switch(myCode) {
    		case 1 : 
    		case 2 : myYear=1900+myYear; break;
    		case 3 :
    		case 4 : myYear=2000+myYear; break;	
    	}
    	
    	//현재 나이 구하기 
    	int myAge = cYear - myYear;
    	
    	String gender = "";
        // 7번째 자리의 숫자(myCode)의 값을 2로 나눠서 나머지가 홀수면 남자, 짝수면 여성을 의미함
    	switch(myCode%2) {
    	case 0: gender= "여자";  break;
    	case 1: gender= "남자";	 break;
    	}
    	
        //12지에 해당하는 동물의 이름을 저장한 배열
    	String[] animal = {"원숭이","닭","개","돼지","쥐","소","호랑이","토끼","용","뱀","말","양"};
    	
        //각각의 정보를 출력함, myYear % 12를 통해 계산된 띠도 출력된다.
    	System.out.println("주민번호 : " + juminno);
    	System.out.println("생년월일 : " + myYear+"년"+myMonth+"월"+myDate+"일");
    	System.out.println("나이 : "+myAge);
    	System.out.println("성별 : "+gender);
    	System.out.println("띠 : "+animal[myYear%12]); //myYear % 12를 통해 계산된 띠
    	
    	
    	//살아온 날 수 구하기
    	//내 생일 데이터에 해당하는 날짜 데이터 생성
    	GregorianCalendar myBirth = new GregorianCalendar();
    	myBirth.set(Calendar.YEAR,myYear);//Calendar의 Year값에 태어난 년도를 대입
    	myBirth.set(Calendar.MONTH, myMonth-1); // GregorianCalendar에서 월은 0부터 시작하므로 1을 빼줌
    	myBirth.set(Calendar.DATE, myDate);//Calendat의 Date의 값에 태어난 일자를 대입
    	
    	 // 두 날짜의 밀리초 단위 차이 계산
         //now 객체는 현재 날짜, myBirth 객체는 해당 주민번호의 대상에 대한 생일을 나타냄 
         //해당하는 값을 계산하여 differenceInMillis에 저장
        long differenceInMillis = now.getTimeInMillis() - myBirth.getTimeInMillis();

        // 밀리초를 일(day) 단위로 변환 (1일 = 24시간 = 1440분 = 86400초 = 86400000밀리초)
        long daysAlive = differenceInMillis / (24 * 60 * 60 * 1000);

        System.out.println("살아온 날수 : " + daysAlive + "일");
    }
}

 

public class Test06_jumin {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		Jumin id = new Jumin("8912301234567");//주민번호의 값을 지정
        					     //입력 받은 값을 Jumin클래스 내부의 juminno로 설정함
		
        //isValidate() 메소드를 통해 유효성 검사를 한다.
        //주민번호의 형식이 맞다면, 주민번호가 맞습니다를 출력하고 아니라면 
        //주민번호가 맞지않습니다.를 출력함(true, false)
		if(id.isValidate()) {
			System.out.println("주민번호가 맞습니다");
			id.disp();
		}else {
			System.out.println("주민번호가 맞지않습니다.");
		}
		
		
		
	}

}

 

자바 콘솔창에서의 출력값