이번엔 날짜를 나타내는 API 메소드들을 배웠다.
가장 처음 배웠던 java.util.Date 말고 어떤 방법들이 있을까. 우선 Date에 대해 자세히 알아보자.
Date
시스템으로부터 현재 날짜, 시간 정보를 가져와서 다룰 수 있게 만들어진 클래스
생성자 2개만 사용하고 나머지는 모두 deprecated 되었다.
Date ( ) ;
Date ( long ) ;
이렇게 두 개만 살아 남아있다.
첫번째로 기본 생성자로 인스턴스를 생성해보자.
시스템(내 운영체제)으로부터 현재 날짜, 시간 정보를 가져와 기본 값으로 사용한다.
Date today = new Date ();
java.util.Date = new java.util.Date(); //이렇게 작성하는 것이 좋다
Date는 java.sql.Date와 java.util.Date가 존재한다.
한 클래스에서 두 개의 타입을 전부 사용하게 되면 import 하더라도 사용하는 타입이
어느 패키지에 있는 Date인지 모호성이 발생하여
import 하더라도 풀 클래스 이름을 작성해 주어야 한다.
여기서는 java.util.Date을 사용한다.
toString() 메소드가 오버라이딩 되어 있어서 쉽게 필드값을 출력해 볼 수 있다.
system.out.println(today);
두번째로 long형 정수 값을 가지고 날짜 시간 계산하는 방법을 보자.
getTime() : 1970년 1월 1일 0시 0분 0초를 기준으로 초 단위 계산하여 iong 타입으로 반환한다. 엥
Dare time = new Date (12345678L); // 이렇게 사용은 어려울 것 컨트롤 불가...
System.out.println(today.getTime()); // 1648349564 대강 이런 long타입 반환됨..
위에 두 방법으로만 날짜를 표현하기에는 역부족 이라는 생각이 든다. long은 왜 살아남은거지..?
다른 방법도 배웠다.
Calendar와 GregorianCalendar
Calendar
java.util.Calendar 클래스의 사용
Calendar 클래스는 추상클래스 abstract 이기 때문에
new 연산자를 통해 인스턴스 생성이 불가능하다.
Calendar 클래스를 사용하기 위한 두 가지 방법은
1. getInstance() static 메소드를 통해서 인스턴스를 생성
Calendar calender = Calendar.getIntstance();
system.out.println(calender);
출력해보면 엄청난 길이의 필드값이 출력된다. 시간에 대한 여러 정보가 줄줄 나옴.
toString이 오버라이딩 되어 있어서 모든 필드의 값을 확인 할 수 있다.
Date 클래스에 비해 매우 많은 필드들이 값을 가지고 있다.
또한 생성된 인스턴스 타입이 후손 클래스인 GregorianCalendar 타입인 것을 확인할 수 있다.
이 방식으로 인스턴스를 생성하게 되면
운영체제의 날짜/시간 정보를 이용해서 인스턴스를 생성하게 된다. ( Date보다 좀 더 자세한 느낌? )
2. 후손클래스인 GregorianCalendar 클래스를 이용해서 인스턴스를 생성
기본 생성자를 사용해 출력하는 방법이다.
calender gregorianCalendar = new GregorianCalendar() ;
System.out.println(gregorianCalendar);
출력된 형태는 동일하다.
다음으로는 년, 월, 일, 시, 분, 초 정보를 이용해 인스턴스를 생성하는 방법이다.
단, 월은 0~11월로 사용하기 때문에 9월은 8 , 0은 12월을 의미한다. 오 별론데2...
// 태어난 날과 시간이 2012년 9월 18일 16시 42분 0초 라면?
// 각 자료형을 만들어 생성자로 넘겨준다. 좀 귀찮은 것 같다.
int year = 2012;
int month = 8;
int dayOfMonth = 18;
int hour = 16;
int min = 42;
int second = 0;
Calender birthDay = new GregorianCalendar(year, month, dayOfMonth , hour, min, second);
System.out.println(birthDay);
출력된 정수로 인스턴스를 생성하면 해당 날자/시간 정보를 가지는 Date 인스턴스가 된다.
Date date = new Date (birthDay.getTimeInMillis());
/* 실제 사용 시 이런 형태로 사용되는 경우가 많다.*/
Date date2 = new Date(new gregorianCaleander
(year, month, dayOfMonth , hour, min, second).getTimeInMillis());
생성된 인스턴스의 필드 정보를 Caleander클래스에 있는 get() 메소드를 사용하여 반환 받을 수 있다.
int birthYear = birthDay.get(1);
int birthMonth = birthDay.get(2);
int birthDayOfMonth = birthDay.get(5);
System.out.println(birthYear);
System.out.println(birthMonth);
System.out.println(birthDayOfMonth);
▲ 인자로 전달하는 정수에 따라 필드값을 반환 받을 수 있다.
하지만 위에 처럼 사용하게 되면 각 필드에 매칭되는 정수를 다 외워야 사용이 가능해진다.
System.out.println(Calender.YEAR);
System.out.println(Calender.MONTH);
System.out.println(Calender.DAY);
▲따라서 해당 값들을 상수 필드 형태로 제공하고 있다.
System.out.println(birthDay.get(Calender.YEAR));
System.out.println(birthDay.get(Calender.MONTH)); //0~11
System.out.println(birthDay.get(Calender.DATE));
/*DAY_OF_WEEK는 일(1),월(2), 화(3)..., 토(7) 의 의미이다.*/
System.out.println(birthDay.get(Calender.DAY_OF_WEEK));
/*AM_PM은 0은 오전 1은 오후 의 의미이다. */
System.out.println(birthDay.get(Calender.AM_PM));
/* 삼항연산자로 오전인지 오후인지 확인하여 출력할 수 있다.*/
System.out.println(birthDay.get(Calender.AM_PM) == Calender.AM ? "오전" : "오후");
▲ get() 메소드의 인자로 정수 대신 상수 필드 값을 호출하는 식으로 코드를 개선하면
보다 의미전달이 쉬운 코드가 된다.
아니 날짜 표현하는 거 되게 귀찮구나.......

'백엔드 과정 > Java' 카테고리의 다른 글
[Java] day19. 컬렉션 프레임워크 ArrayList (0) | 2022.01.11 |
---|---|
[Java] day18 제네릭(Generic) ~ 토끼농장 ~ (0) | 2022.01.07 |
[Java] day17. API - Whapper / porsing (0) | 2022.01.07 |
[Java] day16. API - Object/ String 문자열 메소드() (0) | 2022.01.07 |
[Java] day15. 추상클래스/ 인터페이스 (0) | 2022.01.06 |