[JAVA] 자바 - Calendar 클래스 (달력 만들기, 나이 구하기)
by mini_min[JAVA]
자바 - Calendar 클래스
✔️ Calendar 클래스 란?
- 날짜 관련 클래스. 날짜와 시간을 객체 모델링화 한 클래스로 날짜, 시간과 관련된 정보를 제공한다.
- 추상 클래스이기 때문에 직접 객체 생성은 불가하고, 메소드 구현은 GregorianCalendar() 이용! 또는 getInstance() 이용한다.
🏷️ 객체 생성 방법
* Calendar cal = new Calendar(); //컴파일 오류
* Calendar cal = new Calendar.getInstance();
*또는
* Calendar cal = new GregorianCalendar();
Calendar cal = Calendar.getInstance();
// 순서대로 년-월-일 / 요일 / 시간
String s = String.format("%tF %tA %tT", cal, cal, cal);
System.out.println("현재 날짜 및 시간 : " + s);
int y = cal.get(Calendar.YEAR);
int m = cal.get(Calendar.MONTH)+1;
//Calendar.MONTH : 0(1월) ~ 11(12월) 반환
int d = cal.get(Calendar.DATE);
int w = cal.get(Calendar.DAY_OF_WEEK);
//Calendar.DAY_OF_WEEK : 1(일)~7(토)
int endDay = cal.getActualMaximum(Calendar.DATE);
//월의 마지막 날짜
System.out.println(y+"년 " + m + "월 " + d + "일 ");
System.out.println("요일(1:일~7:토) : " + w);
System.out.println("이번달 마지막 날짜 : " + endDay);
◾ Calendar cal = Calendar.getInstance(); : 캘린더 클래스는 객체 생성이 불가하니, 이전에 싱글톤에서 했던 것처럼 겟인스턴스 메소드를 이용했다! 이후 캘린더 클래스는 자유롭게 소환이 가능하다.
◾ 날짜를 가져오고 싶을 때?
- 클래스이름.get(Calendar.YEAR / MONTH / DATE);
- DAY_OF_WEEK : 요일 찾기
◾ 월, 요일은 주의할 것!
0값부터 1월을 뜻한다. 때문에 내가 7월을 출력하고 싶으면 7-1 해줘야 컴퓨터가 7월 값을 반환한다.
요일은 1부터 7까지 사용 가능하고 1 = 일요일부터 시작이다.
✔️ Calendar 클래스 - 날짜/요일 변경
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, 2022);
cal.set(Calendar.MONTH, 9-1);
cal.set(Calendar.DATE, 10);
System.out.printf("%tF %tA\n", cal, cal); //2022-09-10
cal.set(Calendar.DAY_OF_WEEK, 1); //요일을 일요일로 고친 것
System.out.printf("%tF %tA\n", cal, cal); //2022-09-18 일요일
◾ 자바에 캘린더 클래스에서 날짜, 요일 변경은 set() 메소드를 사용한다. 캘린더 날짜를 소환하고 뒤에 바꿀 연도, 월, 일을 적어주면 cal 캘린더 클래스의 값이 바뀐다.
💡 요일 변경 주의사항
요일은 생성된 캘린더 객체의 '초기 날짜'를 기준으로 날짜의 일요일로 변경한다.
즉, 2022년 7월 21일이 초기 날짜면 21일을 기준으로 요일을 계산함.
set() 메소드로 요일을 변경할 수 있지만, get() 이나 add() 메소드 호출 안하면 시간이 안바뀜.....
그러니,
요일 변경하기 전, getTime() 메소드를 부르자!!
Calendar cal2 = Calendar.getInstance();
cal2.set(Calendar.YEAR, 2022);
cal2.set(Calendar.MONTH, 9-1);
cal2.set(Calendar.DATE, 10);
System.out.printf("%tF %tA\n", cal2, cal2); //2022-09-10
cal2.getTime(); //시간이 변경됨 //get 메소드 부르니 문제 해결~~
cal2.set(Calendar.DAY_OF_WEEK, 1); //요일을 일요일로 고친 것
System.out.printf("%tF %tA\n", cal2, cal2); //2022-09-18 일요일
◾cal2.getTime(); 으로 문제 해결!
✔️ 이번주 시작일과 마지막일 구하기
이번주 시작일과 마지막일을 구하기 위해서 필요한 것!
- 일단 앞에서 본 날짜 바꿀 때 필요한 getTime() 메소드, 그래야 실제 시간이 변경된다.
- 기준이 되는 캘린더 객체 1이 필요하고,
- 시작일과 마지막일을 구할 객체 2가 필요한데, 객체 2는 clone() 복사를 해준다!!!!!
Calendar cal = Calendar.getInstance();
//2022-8-3
cal.set(2022, 8-1, 3);
cal.getTime(); //날짜 바꿔야 할 때 사용 //set으로 설정 후 get 호출해야 실제 시간이 변경
System.out.printf("%tF %tA\n", cal, cal);
//객체 복제(객체는 다르지만 필드의 값은 같게)
Calendar scal = (Calendar)cal.clone();
//같은 날짜를 가지고 있음
//일요일로 변경
scal.set(Calendar.DAY_OF_WEEK, 1);
System.out.printf("주 시작일 : %tF %tA\n", scal, scal);
//주 마지막일
scal.set(Calendar.DAY_OF_WEEK, 7);
System.out.printf("주 시작일 : %tF %tA\n", scal, scal);
}
◾ 객체 복사 방법은 Calendar 클래스이름 = (Calendar)cal(복사할 클래스이름).clone(); 이렇게 주면 된다.
이때 복사된 scal 클래스는 cal 캘린더 클래스의 값을 동일하게 갖는다.
시작일과 마지막일을 각각 요일 변경해 출력하면 끝!
✔️ 생년월일 받아 나이 구하기
🏷️ 코드 짜기 전 생각하기
- 생년월일 받기 : 스캐너 이용
- 단! 생년월일을 8글자로 받고, -,.,/ 등을 없앤다. =do~while 을 사용하고 replaceall 로 숫자 아닌 것들 없애기
- 입력받은 문자열에서 int 자료형으로 추출 =Integer.parseInt 사용
- 오늘 날짜를 캘린더 클래스로 받고 시스템 날짜로 초기화함.
- 오늘 년도 - 태어난 년도
💡 생일이 지나지 않았을때도 생각해야한다!!
- 내 생일의 월이 더 큰 값이거나
- 월은 동일하지만, 날짜가 더 큰 경우일때는 만나이가 1살 더 적다.
💡 \\d{8} : 8글자
\\d{1,3} : 최소1글자, 최대 3글자란 뜻
Scanner sc = new Scanner(System.in);
String birth;
int age;
//2002-02-02 , 20020202 . 2003 02 02 이런형태
do {
System.out.println("생년월일은? ");
birth = sc.next();
birth = birth.replaceAll("\\-|\\/|\\.", "");
}while( ! birth.matches("^\\d{8}$"));
//8자리 입력해야함. 시작부터 끝까지
int y = Integer.parseInt(birth.substring(0, 4));
int m = Integer.parseInt(birth.substring(4, 6));
int d = Integer.parseInt(birth.substring(6));
Calendar now = Calendar.getInstance();
Calendar me = Calendar.getInstance();
me.set(y, m, d);
age = now.get(Calendar.YEAR) - me.get(Calendar.YEAR);
if(m > now.get(Calendar.MONTH)+1 ||
(m==now.get(Calendar.MONTH)+1 && d > now.get(Calendar.DATE)) ) {
age--;
}
System.out.println(age);
}
✔️ Calendar 클래스로 달력만들기
🏷️ 코드 짜기 전 생각하기
- 년, 월 입력받을 스캐너 클래스
- 달력 맨 위에 일~토 요일 찍혀야함 = string 배열로 일~월 생성
- 월은 1~12 사이 숫자를 받아야한다. = do while로 값을 받는다.
- 캘린더 객체의 초기값을 입력 받은 년, 월, 1일로 설정한다. = set() 메소드 필요
- lastDay 변수로 해당 월의 마지막 일자 추출 = getActualMaximum(Calendar.DATE)
💡 우리가 달력을 볼때, 첫 주에 찍히는 날짜는 보통 공백이 발생하는걸 생각할 수 있다. 지금 달력을 만들 때도 마찬가지로, 1일이 어느 요일부터 시작하는지 확인해서 시작하는 요일 앞부분은 공백으로 채워줘야한다.
1) DAY_OF_WEEK 메소드로 cal 캘린더 객체의 요일을 뽑았다면,
2) 요일 값(w) 직전까지는 공백을 출력한다.
1) w = cal.get(Calendar.DAY_OF_WEEK);
2) for(int i=1; i<w; i++) { 공백 출력 }
💡 1일부터 31일까지 for 반복문으로 출력하면 끝!
아, 그리고 토요일(w=7)이 되면 줄바꿈을 실행한다.
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Calendar cal = Calendar.getInstance();
String []week = new String[] {"일", "월", "화", "수", "목", "금", "토"};
int y, m, w, lastDay;
System.out.println("년도? ");
y = sc.nextInt();
do {
System.out.println("월? ");
m = sc.nextInt();
}while(m<1 || m>12);
//cal 객체를 y년 m월 1일로 설정하여 1의 요일과 m월의 마지막 날짜 구하기
cal.set(y,m-1,1);
w = cal.get(Calendar.DAY_OF_WEEK); //1부터 7까지 나옴
lastDay = cal.getActualMaximum(Calendar.DATE);
System.out.println("\t" + y + "년" + m + "월");
for(int i=0; i<week.length; i++) {
System.out.printf("%4s", week[i]);
}
System.out.println("\n=================================");
//1일 앞의 공백처리
for(int i=1; i<w; i++) {
System.out.print(" ");
}
//1일부터 마지막날짜까지 출력
for(int i=1; i<=lastDay; i++) {
System.out.printf("%4d", i);
if(++w%7 ==1) { //일요일이 1이니까 토욜까지 찍고 넘기는 것!
System.out.println();
}
}
if(w%7 !=1) {
System.out.println();
System.out.println("\n=================================");
sc.close();
}
}
'Java' 카테고리의 다른 글
[JAVA] 자바 - StringBuilder, StringBuffer 클래스 (0) | 2022.07.24 |
---|---|
[JAVA] 자바 - String 클래스 (1) (⭐⭐⭐중요) (0) | 2022.07.21 |
[JAVA] 자바 - Wrapper class 란? 개념 정리 (0) | 2022.07.20 |
[JAVA] 자바 - 기본 API 클래스 (import, static import, object, equals) (0) | 2022.07.20 |
[JAVA] 자바 - singleton(싱글톤) 과 getInstance (0) | 2022.07.20 |
블로그의 정보
개발자 미니민의 개발로그
mini_min