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("주민번호가 맞지않습니다.");
}
}
}