워밍업) Date 클래스를 사용해서 달력만들기
1. 형식화 클래스 : DecimalFormat 클래스
- 숫자(정수, 실수, 금액 등)를 원하는 텍스트(문자열)로 변환하는 클래스
- 원하는 형식으로 표현 또는 반환하기 위해서 패턴을 정의
DecimalFormat의 패턴
코드1)
코드2)
+ String으로 된 숫자데이터 -> int / double 변환하기
- DecimalFormat 클래스의 parse() 메서드를 사용하면 된다.
parse() 메서드의 반환타입은 Number 클래스이며,
Number 타입을 int 타입으로 변환하기 위해서는 Number의 intValue();를 사용하면 된다.
double은 doubleValue() 사용
예시1) int형으로 변환
예시2) double형으로 변환
2. 형식화 클래스 : SimpleDateFormat 클래스***
- Date와 Calendar로 날짜를 계산하여 다양한 형태로 간편하게 출력하기 위해서 사용되는 클래스
SimpleDateFormat 패턴에 사용되는 기호
SimpleDateFormat 패턴 사용하기 전 코드)
SimpleDateFormat 패턴 사용한 코드) Date로 생성한 날짜를 사용
SimpleDateFormat 패턴 사용한 코드) Calendar로 생성한 날짜를 사용
* SimpleDateFormat이 받을 수 있는 자료형은 Date라서 Calendar를 Date로 변환해주어야함
+ String 형식의 날짜 -> Date 변환
3. 형식화 클래스 : ChoiceFormat 클래스
- 특정 범위에 속하는 값을 문자열로 변환해주는 형식화 클래스
- 특정 범위 == 경계값(limits)은 double형으로 반드시 오름차순으로 정렬되어 있어야 한다.
- 치환 될 문자열의 개수는 경계값에 의해 정의된 범위의 개수와 일치해야한다. (ex. grades)
- 패턴은 구분자로 # 과 < 두 가지를 제공
1) # : 경계값을 범위에 포함
2) < : 경계값을 범위에 포함X
구분자 없이 경계값(limits)으로만 치환하는 예시)
구분자 # 사용한 예시)
4. 형식화 클래스 : MessageFormat 클래스
- 어떤 데이터를 형식(양식)에 맞춰서 출력하는 클래스
- String.format과 비슷하나 %d, %f, %c.. 사용하지 않고 {0}, {1}, {n} 인덱스로 사용한다.
- format() 메서드를 이용 : static 메서드이기 때문에 객체를 생성하지 않고 사용할 수 있다.
4-1. MessageFormat 클래스의 parse() 메서드***
- 클래스로 출력된 데이터로 부터 필요한 데이터만 뽑아내겠다.
- parse() 메서드를 이용 : 객체를 생성하여 사용
- pattern 형식에 맞춰 source 문자열에 해당하는 인덱스 값을 집어 넣는다.
응용 예제) data4.txt 파일 필요
결과)
5. java.time 패키지(개념 정리)
- Date, Calendar 클래스의 단점 - 예) 두 날짜 사이의 차 -> 개발자가 직접 구현
- 위의 2가지 클래스가 불편해서 아래와 같은 패키지가 생겼다.
5-1. java.time 패키지의 4가지 하위 패키지
-> '불변'
-> 날짜, 시간을 변경하는 메서드들은 기존의 객체를 변경하는 대신 [항상 변경된 새로운 객체를 반환]
1) chrono 패키지 - 표준(ISO)이 아닌 [달력 시스템]을 위한 클래스들을 제공
2) format 패키지 - 날짜와 시간을 [파싱하고 형식화]하기 위한 클래스들을 제공
3) temporal 패키지 - 날짜와 시간의 [필드(filed)와 단위(unit)]를 위한 클래스들을 제공
4) zone 패키지 - [시간대(time-zone)]와 관련된 클래스들을 제공
5-2. 핵심 클래스 + 클래스들 간의 변환하는 작업
- java.time 패캐지의 핵심 클래스 - 날짜 클래스와 시간 클래스로 분리가 되어져 있다.
(Date, Calendar 클래스 = 날짜 + 시간)
<Temporal, TemporalAccessor, TemporalAdjuster 인터페이스를 구현한 클래스>
1) LocalDate 클래스 - 날짜 클래스
2) LocalTime 클래스 - 시간 클래스
3) LocalDateTime 클래스 - 날짜 & 시간 클래스
4) ZonedDateTime 클래스 - 날짜 + 시간 + 시간대 클래스
<TemporalAmount 인터페이스를 구현한 클래스>
5) Period 클래스와 Duration 클래스 차이점?
- 날짜 사이의 간격 = 날짜 - 날짜 -> Period 클래스
- 시간 사이의 간격 = 시간 - 시간 -> Duration 클래스
Period 클래스와 Duration 클래스 메서드
- between() 메서드
- until() 메서드
- of() 메서드
- with() 메서드
*** 위의 클래스 객체 생성하는 방법 : now(), of() 메서드로 생성한다. ***
(new 연산자 X, getInstance() X)
6) 참고 : 굳이 어려운 용어를 사용한 이유 -> 아래와 같이 구분을 하기 위해서 어려운 용어를 사용했다.
temporal 용어 : 시간 (== time) - 시, 분, 초를 나타낼 때 -> 시간
chrono 용어 : 시간 (== time) - 년, 월, 일, 시, 분, 초를 나타낼 때 -> 날짜와 시간
7) TemporalUnit 인터페이스 - 날짜와 시간의 [단위]를 정의한 인터페이스
ㄴ 구현 클래스 : ChronoUnit 클래스(열거형)
TemporalField 인터페이스 - 날짜와 시간의 [필드]를 정의한 인터페이스
ㄴ 구현 클래스 : ChronoField 클래스(열거형)
* 열거형(enumeration) ? 서로 관련된 '상수'를 묶어 놓은 것
- 날짜, 시간 값을 얻어올 때 get(), getXXX() + 열거형 클래스 사용
- 날짜, 시간 값을 수정할 때 with() / plus() / minus()
- 날짜, 시간 비교할 때 isAfter() / isBefore() / isEqual()
8) Instant - 에포크 타입(1970.1.1 00:00:00)부터 경과된 시간을 나노초(ns) 단위로 표현
Instant -> Date 변환 가능
Date -> Instant 변환 가능
9) LocalDateTime -> LocalDate 변환
LocalDate -> LocalDateTime 변환
10) TemporalAdjusters 클래스
- plus() / minus() 메서드로 날짜, 시간을 계산할 수 있다.
- 다음주 목요일, 지난주 금요일 계산할 때 편리한 기능(메서드)이 구현된 클래스
- 여러 가지 유용한 메서드가 있다.
11) 날짜, 시간
-> 형식 ofPattern()
-> 파싱 parse()
6. java.time 패키지 - LocalDate 클래스
- 날짜 정보 가져오는 클래스
- now() : 현재 시스템의 날짜 객체 생성
- of() : 내가 원하는 날짜 객체 생성
// 객체 생성 예시
LocalDate d = LocalDate.now();
LocalDate d = LocalDate.df(year, month, day);
코드) 년도, 월, 일 가져오기
코드 ) 날짜 정보 수정하기 - with() / plus() / minus()
- plus()메서드 중 매개변수를 살펴보면, Period 클래스를 줘야하는 것도 있음 -> 자세히 배울 예정
- with(), wtihXXX() 메서드 : 날짜만 새로운 날짜로 수정해주는 메서드
- plus() / minus() 메서드 : 날짜 +- 해주는 메서드
7. java.time 패키지 - LocalTime 클래스
- 시간 정보 가져오는 클래스
- now() : 현재 시스템의 시간 객체 생성
- of() : 내가 원하는 시간 객체 생성
- 시간 변경시 plus() / minus() / with() 메서드 사용
코드)
6. 7. LocalDate 와 LocalTime 의 필드의 값을 반환하는 메서드
매개변수로 사용할 수 있는 필드의 목록(ChronoField에 정의된 상수 목록)
8. truncatedTo() 메서드
- truncatedTo(매개변수) : 매개변수 밑으로는 절삭하겠다.
예시)
9. 날짜, 시간의 비교 - isAfter() / isBefore() / isEqual() / compareTo() 메서드
- isAfter() : 이후이면 true, 이전이면 false
- isBefore() : 이전이면 true, 이후이면 fasle
- isEqual() : 같으면 true, 다르면 false / LocalDate에만 있음
- compareTo() : 같으면 0, 이전 -1, 이후 1
예시)
10. Instant 클래스
- Instant 클래스 == java.util.Date 클래스를 대체하기 위해서 만든 클래스
- 따라서, Date 클래스 <--> Instant 클래스 변환 메서드 추가
1) from() 메서드 : Instant -> Date 변환 메서드
2) toInstant() 매서드 : Date -> Instant 변환 메서드
이정도 개념만 파악하기
11. java.time 패키지 - LocalDateTime 클래스
- 날짜 + 시간 객체 = LocalDateTime
예시)
12. TemporalAdjusters 클래스
- 자주 사용되는 날짜 계산 메서드를 구현해 놓은 클래스
ex) 다음 주 금요일 휴강입니다. - 몇일?
다가오는 3째주 금요일에 만나요 - 몇일?
예시)
- 이후 날짜를 구할 때는 TemporalAdjusters.next() 사용
- 이전 날짜를 구할 때는 TemporalAdjusters.previous() 사용
TemporalAdjusters의 메서드
메서드 사용 예시)
package days23;
import java.time.*;
import java.time.temporal.*;
import static java.time.DayOfWeek.*;
import static java.time.temporal.TemporalAdjusters.*;
public class Ex11 {
public static void main(String[] args) {
LocalDate today = LocalDate.now();
LocalDate date = today.with(new DayAfterTomorrow());
System.out.println(date);
p(today);
p(date);
p(today.with(firstDayOfNextMonth()));
p(today.with(firstDayOfMonth()));
p(today.with(lastDayOfMonth()));
p(today.with(firstInMonth(FRIDAY)));
p(today.with(lastInMonth(FRIDAY)));
p(today.with(previous(FRIDAY)));
p(today.with(previousOrSame(FRIDAY)));
p(today.with(next(FRIDAY)));
p(today.with(nextOrSame(FRIDAY)));
p(today.with(dayOfWeekInMonth(4, FRIDAY)));
} // main
static void p(Object obj) {
System.out.println(obj);
}
} // class
class DayAfterTomorrow implements TemporalAdjuster {
@Override
public Temporal adjustInto(Temporal temporal) {
return temporal.plus(2, ChronoUnit.DAYS);
}
} // DayAfterTomorrow class
'TIL > Java' 카테고리의 다른 글
[SIST] Java_days25 (0) | 2022.03.24 |
---|---|
[SIST] Java_days24 (0) | 2022.03.23 |
[SIST] Java_days22 (0) | 2022.03.21 |
[SIST] Java_days21 (0) | 2022.03.18 |
[SIST] Java_days20 (0) | 2022.03.17 |