개발자 미니민의 개발스터디

[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();

	}

	}

 

 

 

 

블로그의 정보

개발자 미니민의 개발로그

mini_min

활동하기