Jam's story
10일차 본문




String 주민등록번호

String.format
예)
String data=String.format("%s-%s-%s-%s", cardNumbers[0],cardNumbers[1],cardNumbers[2],cardNumbers[3]);
String.join
String card=String.join("-", cardNumbers);
뒷자리 첫번째수만 공개
charAt(0)을 사용해서 앞자리수만공개하고 , 나머지는 String 형으로 재선언하여 처리

toCharArray() - 한문자마다 배열로 만들어줌
String -> char
String 변수를 toCharArray() 메소드를 이용해서 char 한문자씩 쪼개고 char 배열에 넣어준다.

subString(시작 인덱스, 마지막인덱스+1);
- end 인덱스를 생략하면 끝까지라는 뜻이다.
char -> String 변환 new String()이용

main 메소드는 언제 호출되어지는가?



여자인지 남자인지 확인하는 boolean getGender()






주민등록번호- >생년월일 getBrith()
내 코드
int year=Integer.parseInt(rrn.substring(0,2));
if (year>22) {
year=Integer.parseInt(rrn.substring(0,2))+1900;
}else {
year=
Integer.parseInt(rrn.substring(0,2))+2000;
}
int month=Integer.parseInt(rrn.substring(2,4));
int day=Integer.parseInt(rrn.substring(4,6));
String birthday=year+"년 "+month+"월 "+day+"일";
return birthday;

int year=Integer.parseInt(rrn.substring(0,2));
int month=Integer.parseInt(rrn.substring(2,4)); //01->1
int day=Integer.parseInt(rrn.substring(4,6));
//네 자리의 연도로 만들기
switch(rrn.charAt(7)-48) {
case 0: case 9:
year+=1800;
break;
case 1: case 2: case 5: case 6:
year+=1900;
break;
default:
year+=2000;
break;
}
//String.format() 내가 원하는 형식의 문자열로 변환
String birthday=String.format("%d년 %02d월 %d일",year,month,day);
return birthday;
- rrn.charAt(7)-48 => 인덱스가 7인곳을 추출해와서 1의 아스키코드가 49이니까 48을 뺌
만나이, 세는 나이 계산

세는나이

더 간단하게 바꾸기

현재 시스템의 년도를 얻어오는 코딩

만나이
package days10;
import java.util.Date;
/**
* @author kenik
* @date 2022. 3. 2. - 오후 3:01:22
* @subject 주민등록번호 -> 성별, 생년월일, [ 나이 ]
* @content
*/
public class Ex05_05 {
public static void main(String[] args) {
/*
* 만 나이 - 태어날 일을 기준으로 1년이 지나야지 1살을 먹는다.
* 세는 나이(햇수 나이) - 태어나자마자 1살을 먹고 새해 1월1일되면 1살 더 먹는다.
*
* A사람 2019.12.31 2020.1.1 2020.12.29 2020.12.30 2021.1.1
* 2019.12.30 태어남
*
* 만나이 0살 0살 0살 1살 1살 생일 지났냐? 여부
* 세는나이 1살 2살 2살 2살 3살
* */
String rrn = Ex05_02.getRRN();
//int countingAge = getCountingAge( rrn );
// System.out.println( countingAge );
int americanAge = getAmericanAge( rrn );
System.out.println( americanAge );
// [질문] 메서드 차이점 - 3가지 파악( 기능, 매개변수, 리턴값 )
// void System.out.pritnf("출력형식", 출력값...) 기능, 매개변수 O,리턴값(리턴자료형) void
// String String.format("출력형식", 출력값...) 기능, 매개변수 O,리턴값(리턴자료형) String
} // main
// 주민등록번호로부터 만나이를 반환하는 메서드
private static int getAmericanAge(String rrn) {
// 만 나이 = 올해(2022) - 생일년도 + 1
// 만 나이 ? 2019.1.13 2020.1.13(1살) 2021.1.13(2살) 2022.1.13(3살)
// 계산방법 1) 몫(나이) == 총산일수 / 365.25
// 계산방법 2) 올해 - 생일년도 - 1 ( 생일 지났는지 여부 )
// 2022 - 2019
// 생일이 지나지 않은 경우 3살 -1 = 2살
// " 지난 경우 3살
int age; // age 나이
Date d = new Date();
int now = d.getYear() + 1900; // 올해 2022
int yearBD = Integer.parseInt( Ex05_04.getBirth(rrn).substring(0, 4) ); // 1999 <- "1999" <- "1999년 01월 12일"
age = now - yearBD ;
// 올해 3월 29일 생일 월 4월1일
// A 학생 X
// if (nowMonth <= monthBD && nowDate < dateBD) age -= 1;
// B 학생 ( 정답 )
// 생일 월 >= 올해 월
// 3 4
/*
if(monthBD>= month) {
if(dateBD>=date) {
age = year-yearBD;
}
}else age = year -yearBD -1;
*/
// 삼항연산자 age = now - yearBD -(monthBD >= month ? (dateBD >= date ? 0 :1) : 1) ;
// 생일이 지나지 않은 경우의 조건식
/*
int monthBD = Integer.parseInt ( Ex05_04.getBirth(rrn).substring(6, 8) ) ; // 1 <= "1999년 01월 12일"
int dateBD = Integer.parseInt(Ex05_04.getBirth(rrn).substring(10, 12)); // 12
int month = d.getMonth() + 1; // 1월(0) ~ 12월(11)
int date = d.getDate();
if( !( monthBD>= month && dateBD>=date ) ) age--;
*/
// C 학생 "890112-XXXX" 비전공자
int birthMD = Integer.parseInt( "0112") ; // 112
int nowMD = Integer.parseInt( "0302" ); // 302
if( birthMD < nowMD ) age--;
// 강사 Date 클래스의 객체
// true/false 생일날짜객체.before( 현재날짜객체 )
// d.after(d2)
// d.before(d)
//
return age;
}
private static int getCountingAge(String rrn) {
// 세는 나이 = 올해(2022) - 생일년도 + 1
int age; // age 나이
Date d = new Date();
int now = d.getYear() + 1900; // 올해 2022
int yearBD = Integer.parseInt( Ex05_04.getBirth(rrn).substring(0, 4) ); // 1999 <- "1999" <- "1999년 01월 12일"
age = now - yearBD + 1; // 2022 - 1989 + 1
return age;
}
} // class
과제 주민등록번호 -> 출생지역 출력

주민번호 검증 규칙

int[] m= {2,3,4,5,6,7,8,9,2,3,4,5};
int tot=0;
for(int i=0; i<=12; i++) {
if(i==6) continue;
tot+=Integer.parseInt(rrn.substring(i,i+1))*m[i];
}
int ㅍ=11-(tot%11)%10;
int ㅎ = Integer.parseInt( rrn.substring(13, 14) ) ;
if( ㅍ == ㅎ ) System.out.println( "올바른 주민등록번호 입니다.");
else System.out.println( "잘못된 주민등록번호 입니다.");

-를 0으로 설정해놓으면 if continue 문 안써도됨