Java 8 Date/Time API ํ์ฉํ๊ธฐ ๐ฐ๏ธ

์๋ , ์๋ฐ ๊ฐ๋ฐ์ ์น๊ตฌ๋ค! ์ค๋์ ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ๊ทธ ์๊ฐโฐ์ ๋ํด ์ด์ผ๊ธฐํด๋ณผ ๊ฑฐ์ผ. ๊ทผ๋ฐ ์ด๋ฒ์ ์ข ํน๋ณํด. ์ฐ๋ฆฌ์ ๋ ๋ ํ ์น๊ตฌ Java 8์ด ์๊ฐํ ์๋ก์ด Date/Time API์ ๋ํด ๊น์ด ํํค์ณ๋ณผ ๊ฑฐ๊ฑฐ๋ ! ๐
ํน์ ์์ ์ ์๋ฐ๋ก ๋ ์ง์ ์๊ฐ์ ๋ค๋ค๋ณธ ์ ์์ด? ๊ทธ๋ ๋๋ ๊ทธ ๋ถํธํจ, ๊ทธ ๋ณต์กํจ... ๋ค๋ค ๊ณต๊ฐํ์ง? ๐ ํ์ง๋ง ์ด์ ๊ทธ๋ฐ ๊ณ ๋ฏผ์ bye bye~ Java 8์ Date/Time API์ ํจ๊ป๋ผ๋ฉด ์๊ฐ ๋ค๋ฃจ๊ธฐ๊ฐ ์ ๋ง ์ฌ์์ง๋ค๊ณ !
์, ๊ทธ๋ผ ์ฐ๋ฆฌ ํจ๊ป ์๊ฐ ์ฌํ์ ๋ ๋๋ณผ๊น? ๐ Java 8 Date/Time API์ ์ธ๊ณ๋ก ๊ณ ๊ณ ์ฝ!
1. Java 8 ์ด์ ์ ๋ ์ง์ ์๊ฐ ์ฒ๋ฆฌ, ๋ฌด์์ด ๋ฌธ์ ์์๊น? ๐ค
Java 8 ์ด์ ์๋ ๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ ๊ฒ ์ ๋ง... ์, ์ด๋ป๊ฒ ํํํด์ผ ํ ๊น? '์ฌ๋ฏธ์๋ ๋์ '์ด์๋ค๊ณ ํ ๊น? ๐
๊ทธ๋๋ ์ฃผ๋ก java.util.Date
์ java.util.Calendar
ํด๋์ค๋ฅผ ์ฌ์ฉํ์์ง. ๊ทผ๋ฐ ์ด ๋
์๋ค, ๋ฌธ์ ๊ฐ ์ข ๋ง์์ด.
Java 8 ์ด์ ๋ ์ง/์๊ฐ API์ ์ฃผ์ ๋ฌธ์ ์ ๋ค:
- ๋ถ๋ณ์ฑ(Immutability) ๋ถ์กฑ ๐ฑ
- ํท๊ฐ๋ฆฌ๋ ์ ํํ (0๋ถํฐ ์์) ๐
- ์ฐ๋ ๋ ์์ ์ฑ(Thread-safety) ๋ฌธ์ ๐ฐ
- ์๊ฐ๋(TimeZone) ์ฒ๋ฆฌ์ ์ด๋ ค์ ๐
- ๋ ์ง ์ฐ์ฐ์ ๋ณต์ก์ฑ ๐งฎ
์ด๋ฐ ๋ฌธ์ ์ ๋ค ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ๋ง์ ๊ณ ๋ฏผ์ ํ์ด. "์, ๋ ์ง ๊ณ์ฐ ์ข ์ฝ๊ฒ ํ ์ ์๋?", "์ด ์ฝ๋๊ฐ ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ์์ ํ ๊น?", "๋ค๋ฅธ ์๊ฐ๋ ์ฒ๋ฆฌ๋ ์ด๋ป๊ฒ ํ์ง?" ์ด๋ฐ ์ง๋ฌธ๋ค์ด ๊ฐ๋ฐ์๋ค์ ๋จธ๋ฆฌ๋ฅผ ์ํ๊ฒ ํ์ง.
์๋ฅผ ๋ค์ด, ํ ๋ฌ์ ๋ํ๋ ๊ฐ๋จํ ์ฐ์ฐ๋ ๊ฝค ๋ณต์กํ์ด. ๋ด๋ด:
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MONTH, 1);
Date oneMonthLater = calendar.getTime();
์... ์ข ๋ณต์กํ์ง ์์? ๐
๊ฒ๋ค๊ฐ ์ด ์ฝ๋, ๋ฉํฐ์ฐ๋ ๋ ํ๊ฒฝ์์๋ ์์ ํ์ง ์์. ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์ด Calendar
์ธ์คํด์ค๋ฅผ ์์ ํ๋ ค ๋ค๋ฉด? ์... ์๊ฐ๋ง ํด๋ ์์ฐํ๋ค. ๐ฑ
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๋ฐ๋ก ๋ถ๋ณ์ฑ(Immutability)์ด ์๋ค๋ ๊ฑฐ์ผ. ์ด๊ฒ ๋ญ ์๋ฆฌ๋๊ณ ? ์ฝ๊ฒ ์ค๋ช
ํด์ค๊ฒ. ์๋ฅผ ๋ค์ด, Date
๊ฐ์ฒด๋ฅผ ์ฌ๊ธฐ์ ๊ธฐ ์ ๋ฌํ๋ค ๋ณด๋ฉด ์ด๋ ์๊ฐ ๊ทธ ๊ฐ์ด ๋ฐ๋์ด ์์ ์ ์์ด. ๋๊ตฐ๊ฐ๊ฐ ๊ทธ ๊ฐ์ฒด์ ๋ด๋ถ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์๊ธฐ ๋๋ฌธ์ด์ง. ์ด๊ฑด ์ ๋ง ํฐ ๋ฌธ์ ์ผ. ํนํ ์ฌ๋ฌ ์ฐ๋ ๋๊ฐ ๋์์ ์์
ํ๋ ํ๊ฒฝ์์๋ ๋๋์ฑ!
๋ ํ๋, ์(Month)์ ํํํ๋ ๋ฐฉ์๋ ๋ง์ ๊ฐ๋ฐ์๋ค์ ํผ๋์ค๋ฝ๊ฒ ํ์ด. Java์์๋ ์์ 0๋ถํฐ 11๊น์ง์ ์ซ์๋ก ํํํ๊ฑฐ๋ . ๊ทธ๋์ 1์์ 0, 12์์ 11์ด ๋๋ ๊ฑฐ์ง. ์ด๊ฑฐ ์ง์ง ํท๊ฐ๋ฆฌ์ง ์์? ๐ตโ๐ซ
Calendar calendar = Calendar.getInstance();
calendar.set(2023, 0, 1); // 2023๋
1์ 1์ผ์ ์ค์ ํ๋ ค๋ฉด ์ด๋ ๊ฒ!
์ด๋ฐ ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ด. ๊ทผ๋ฐ ์ด๋ ๊ฒ ํ๋ฉด ๊ฐ๋ ์ฑ๋ ๋จ์ด์ง๊ณ , ์ค์ํ๊ธฐ๋ ์ฝ์ง.
์๊ฐ๋(TimeZone) ์ฒ๋ฆฌ๋ ํฐ ๊ณจ์นซ๊ฑฐ๋ฆฌ ์ค ํ๋์์ด. ๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ ๊ฒฝ์ฐ, ์๋ก ๋ค๋ฅธ ์๊ฐ๋๋ฅผ ๋ค๋ฃจ๋ ๊ฒ ์ ๋ง ์ค์ํ๋ฐ, ๊ธฐ์กด์ API๋ก๋ ์ด๊ฑธ ์ฒ๋ฆฌํ๊ธฐ๊ฐ ๋๋ฌด ์ด๋ ค์ ๊ฑฐ๋ .
๊ทธ๋ฆฌ๊ณ ๋ ์ง ์ฐ์ฐ... ์, ์ด๊ฑด ์ ๋ง ๋ง๋ ๋ชป ํด. ๐ซ ๋จ์ํ ๋ฉฐ์น ํ์ ๋ ์ง๋ฅผ ๊ตฌํ๋ ๊ฒ๋ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ์ด. ์๋ฅผ ๋ค์ด, 30์ผ ํ์ ๋ ์ง๋ฅผ ๊ตฌํ๋ ์ฝ๋๋ฅผ ํ๋ฒ ๋ณผ๊น?
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.DAY_OF_MONTH, 30);
Date thirtyDaysLater = calendar.getTime();
์... ์ข ๋ณต์กํ์ง? ๊ทธ๋ฆฌ๊ณ ์ด ์ฝ๋, ์ค๋ ์ด๋ ์๋ง ๋ ์ง ๋ณ๊ฒฝ ๊ฐ์ ํน์ํ ๊ฒฝ์ฐ๋ฅผ ์ ๋๋ก ์ฒ๋ฆฌํ ์ ์์๊น? ๊ทธ๊ฑด ๋ ๋ค๋ฅธ ๋ฌธ์ ์ผ.
์ด๋ฐ ๋ฌธ์ ๋ค ๋๋ฌธ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณค ํ์ด. ํนํ Joda-Time์ด๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ธ๊ธฐ ์์์ง. ์ค์ ๋ก Java 8์ ์๋ก์ด Date/Time API๋ Joda-Time์์ ๋ง์ ์๊ฐ์ ๋ฐ์๋.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Java 8 ์ด์ ์ ๋ ์ง์ ์๊ฐ ์ฒ๋ฆฌ์ ์ฃผ์ ๋ฌธ์ ์ ๋ค์ด์ผ. ์ด๋ฐ ๋ฌธ์ ๋ค ๋๋ฌธ์ ๊ฐ๋ฐ์๋ค์ ๋ง์ ๊ณ ๋ฏผ์ ํ๊ณ , ๊ฒฐ๊ตญ Java 8์์ ์์ ํ ์๋ก์ด Date/Time API๊ฐ ํ์ํ๊ฒ ๋ ๊ฑฐ์ง.
๊ทธ๋ผ ์ด์ ์ฐ๋ฆฌ์ ๊ตฌ์์, Java 8 Date/Time API์ ๋ํด ์์ธํ ์์๋ณผ ์ฐจ๋ก์ผ! ์ด๋ค ๋๋ผ์ด ๊ธฐ๋ฅ๋ค์ด ์ฐ๋ฆฌ๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ณ ์์๊น? ๐ ๋ค์ ์น์ ์์ ๊ณ์ ์์๋ณด์!
2. Java 8 Date/Time API์ ๋ฑ์ฅ! ๐
๋๋์ด ์ฐ๋ฆฌ์ ์์ ์ด ๋ฑ์ฅํ์ด! Java 8๊ณผ ํจ๊ป ์๊ฐ๋ ์๋ก์ด Date/Time API, ์ ์ ๋ช ์นญ์ java.time ํจํค์ง์ผ. ์ด ๋ ์, ์ ๋ง ๋๋จํด. ์์ ๋งํ๋ ๋ชจ๋ ๋ฌธ์ ์ ๋ค์ ํด๊ฒฐํ๊ณ , ๋ ์ง๊ด์ ์ด๊ณ ์ฌ์ฉํ๊ธฐ ์ฌ์ด ๋ฐฉ๋ฒ์ ์ ๊ณตํด์ฃผ๊ฑฐ๋ . ๐
์, ๊ทธ๋ผ ์ด ์๋ก์ด API์ ์ฃผ์ ํน์ง๋ค์ ํ๋์ฉ ์ดํด๋ณผ๊น?
Java 8 Date/Time API์ ์ฃผ์ ํน์ง:
- ๋ถ๋ณ์ฑ(Immutability) ๋ณด์ฅ ๐ก๏ธ
- ๋ช ํํ ๊ตฌ๋ถ: ์ฌ๋์ ์ํ ์๊ฐ vs ๊ธฐ๊ณ๋ฅผ ์ํ ์๊ฐ ๐งโ๐คโ๐ง๐ค
- ๋ค์ํ ๋ ์ง/์๊ฐ ๊ด๋ จ ํด๋์ค ์ ๊ณต ๐
- ๊ฐ๋ ฅํ ํฌ๋งคํ ๊ธฐ๋ฅ ๐จ
- ์๊ฐ๋(TimeZone) ์ง์ ๊ฐ์ ๐
- ISO-8601 ํ์ค ์ค์ ๐
์์ฐ! ์ ๋ง ๋ง์ ๊ฐ์ ์ ์ด ์๋ค. ํ๋์ฉ ์์ธํ ์์๋ณด์!
2.1 ๋ถ๋ณ์ฑ(Immutability) ๋ณด์ฅ ๐ก๏ธ
์๋ก์ด API์ ๊ฐ์ฅ ํฐ ํน์ง ์ค ํ๋๋ ๋ฐ๋ก ๋ถ๋ณ์ฑ์ด์ผ. ์ด๊ฒ ๋ญ๊ฐ ๊ทธ๋ ๊ฒ ์ค์ํ๋๊ณ ? ์์ฒญ ์ค์ํด!
๋ถ๋ณ ๊ฐ์ฒด๋ ํ ๋ฒ ์์ฑ๋๋ฉด ๊ทธ ์ํ๋ฅผ ๋ณ๊ฒฝํ ์ ์์ด. ์ฆ, ๊ฐ์ฒด์ ๋ด๋ถ ๊ฐ์ ์์ ํ๋ ๋ฉ์๋๊ฐ ์๋ค๋ ๊ฑฐ์ง. ๋์ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ๋์ํด. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ด ์์ด:
- ์ฐ๋ ๋ ์์ ์ฑ(Thread-safety) ๋ณด์ฅ ๐
- ์์ธก ๊ฐ๋ฅํ ๋์ ๐
- ๊ฐ์ ์์ ์ฑ ๐
์๋ฅผ ๋ค์ด, LocalDate
๋ LocalTime
๊ฐ์ ํด๋์ค์ ์ธ์คํด์ค๋ ํ ๋ฒ ์์ฑ๋๋ฉด ์ ๋ ๋ณ๊ฒฝ๋์ง ์์. ๋ ์ง๋ ์๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์ถ๋ค๋ฉด? ์๋ก์ด ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ด์ผ ํด. ์ด๋ ๊ฒ:
LocalDate today = LocalDate.now();
LocalDate tomorrow = today.plusDays(1); // ์๋ก์ด LocalDate ์ธ์คํด์ค ์์ฑ
์ฌ๊ธฐ์ today
์ ๊ฐ์ ๋ณ๊ฒฝ๋์ง ์๊ณ , ๋์ ์๋ก์ด LocalDate
์ธ์คํด์ค์ธ tomorrow
๊ฐ ์์ฑ๋ผ. ์ด๋ ๊ฒ ํ๋ฉด ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋์์ ์ ๊ทผํด๋ ์์ ํ๊ณ , ์ฝ๋์ ๋์์ ์์ธกํ๊ธฐ๋ ์ฌ์์ ธ.
2.2 ๋ช ํํ ๊ตฌ๋ถ: ์ฌ๋์ ์ํ ์๊ฐ vs ๊ธฐ๊ณ๋ฅผ ์ํ ์๊ฐ ๐งโ๐คโ๐ง๐ค
Java 8 Date/Time API๋ ์ฌ๋์ด ์ฌ์ฉํ๋ ์๊ฐ๊ณผ ๊ธฐ๊ณ๊ฐ ์ฌ์ฉํ๋ ์๊ฐ์ ๋ช ํํ ๊ตฌ๋ถํด. ์ด๊ฒ ๋ฌด์จ ๋ง์ด๋๋ฉด...
- ์ฌ๋์ ์ํ ์๊ฐ: ์ฐ๋ฆฌ๊ฐ ์ผ์์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ ์ง, ์๊ฐ, ๊ธฐ๊ฐ ๋ฑ์ ๋ค๋ฃจ๋ ํด๋์ค๋ค์ด์ผ. ์๋ฅผ ๋ค๋ฉด
LocalDate
,LocalTime
,LocalDateTime
๊ฐ์ ๊ฒ๋ค์ด ์์ด. - ๊ธฐ๊ณ๋ฅผ ์ํ ์๊ฐ: ์ปดํจํฐ๊ฐ ์ดํดํ๊ธฐ ์ฌ์ด ํํ์ ์๊ฐ์ ๋ค๋ฃจ๋ ํด๋์ค์ผ. ์ฃผ๋ก
Instant
๋ฅผ ์ฌ์ฉํด.
์ด๋ ๊ฒ ๊ตฌ๋ถํ๋ฉด ๋ญ๊ฐ ์ข์๊น? ์ฉ๋์ ๋ง๋ ์ ์ ํ ํด๋์ค๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์์ด์ ์ฝ๋์ ์๋๋ฅผ ๋ ๋ช
ํํ๊ฒ ํํํ ์ ์์ด. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ์์ผ์ ์ ์ฅํ ๋๋ LocalDate
๋ฅผ ์ฌ์ฉํ๊ณ , ๋ก๊ทธ ๊ธฐ๋ก ์๊ฐ์ Instant
๋ฅผ ์ฌ์ฉํ๋ ์์ด์ง.
2.3 ๋ค์ํ ๋ ์ง/์๊ฐ ๊ด๋ จ ํด๋์ค ์ ๊ณต ๐
Java 8 Date/Time API๋ ์ ๋ง ๋ค์ํ ํด๋์ค๋ฅผ ์ ๊ณตํด. ๊ฐ๊ฐ์ ํด๋์ค๋ ํน์ ํ ์ฉ๋์ ์ต์ ํ๋์ด ์์ด์, ์ํฉ์ ๋ง๋ ๊ฐ์ฅ ์ ์ ํ ํด๋์ค๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์์ด. ์ฃผ์ ํด๋์ค๋ค์ ์ดํด๋ณผ๊น?
์ฃผ์ ๋ ์ง/์๊ฐ ํด๋์ค:
LocalDate
: ๋ ์ง๋ง ํํ (์: 2023-06-15)LocalTime
: ์๊ฐ๋ง ํํ (์: 14:30:00)LocalDateTime
: ๋ ์ง์ ์๊ฐ์ ํจ๊ป ํํ (์: 2023-06-15T14:30:00)ZonedDateTime
: ์๊ฐ๋ ์ ๋ณด๋ฅผ ํฌํจํ ๋ ์ง์ ์๊ฐInstant
: ๊ธฐ๊ณ๊ฐ ์ดํดํ๋ ์๊ฐ ํํ (1970๋ 1์ 1์ผ UTC ์์ ๋ถํฐ์ ๋๋ ธ์ด)Duration
: ๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉPeriod
: ๋ ๋ ์ง ์ฌ์ด์ ๊ฐ๊ฒฉ
์! ์ ๋ง ๋ค์ํ์ง? ๊ฐ ํด๋์ค์ ์ฌ์ฉ ์๋ฅผ ๊ฐ๋จํ ๋ณผ๊น?
// LocalDate ์ฌ์ฉ ์
LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1990, 1, 1);
// LocalTime ์ฌ์ฉ ์
LocalTime now = LocalTime.now();
LocalTime bedtime = LocalTime.of(22, 30);
// LocalDateTime ์ฌ์ฉ ์
LocalDateTime currentDateTime = LocalDateTime.now();
LocalDateTime futureDateTime = LocalDateTime.of(2025, 12, 25, 10, 30);
// ZonedDateTime ์ฌ์ฉ ์
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
// Instant ์ฌ์ฉ ์
Instant timestamp = Instant.now();
// Duration ์ฌ์ฉ ์
Duration timePassed = Duration.between(LocalTime.of(9, 0), LocalTime.of(17, 0));
// Period ์ฌ์ฉ ์
Period age = Period.between(birthday, today);
์ด๋ ๊ฒ ๋ค์ํ ํด๋์ค๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ, ๊ฐ๋ฐ์๋ค์ ๊ฐ ์ํฉ์ ๊ฐ์ฅ ์ ํฉํ ํด๋์ค๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด. ์ด์ ์๋ ํ๋์ ํด๋์ค๋ก ๋ชจ๋ ์ํฉ์ ๋ค๋ค์ผ ํ๋ ๊ฒ์ ๋นํ๋ฉด ์ ๋ง ํฐ ๋ฐ์ ์ด์ง?
2.4 ๊ฐ๋ ฅํ ํฌ๋งคํ ๊ธฐ๋ฅ ๐จ
๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ค ๋ณด๋ฉด ํฌ๋งคํ ์ด ์ ๋ง ์ค์ํด. ์ฌ์ฉ์์๊ฒ ๋ณด์ฌ์ค ๋๋ ์ฝ๊ธฐ ์ฌ์ด ํํ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅํ ๋๋ ํ์คํ๋ ํํ๋ก ๋ณํํด์ผ ํ๋๊น. Java 8 Date/Time API๋ ์ด๋ฐ ํฌ๋งคํ ์์ ์ ์ ๋ง ์ฝ๊ณ ๊ฐ๋ ฅํ๊ฒ ๋ง๋ค์ด์ค.
DateTimeFormatter
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ํ์์ผ๋ก ๋ ์ง์ ์๊ฐ์ ํฌ๋งคํ
ํ ์ ์์ด. ๋ฏธ๋ฆฌ ์ ์๋ ํฌ๋งคํฐ๋ฅผ ์ฌ์ฉํ ์๋ ์๊ณ , ์ปค์คํ
ํฌ๋งคํฐ๋ฅผ ๋ง๋ค ์๋ ์์ง. ์๋ฅผ ๋ค์ด๋ณผ๊น?
LocalDate today = LocalDate.now();
// ๋ฏธ๋ฆฌ ์ ์๋ ํฌ๋งคํฐ ์ฌ์ฉ
String formattedDate = today.format(DateTimeFormatter.ISO_DATE); // 2023-06-15
// ์ปค์คํ
ํฌ๋งคํฐ ์ฌ์ฉ
DateTimeFormatter customFormatter = DateTimeFormatter.ofPattern("yyyy๋
MM์ dd์ผ");
String koreanDate = today.format(customFormatter); // 2023๋
06์ 15์ผ
// ๋ฌธ์์ด์ ๋ ์ง๋ก ํ์ฑ
LocalDate parsedDate = LocalDate.parse("2023-06-15", DateTimeFormatter.ISO_DATE);
์ด๋ ๊ฒ ๊ฐ๋จํ๊ฒ ๋ ์ง์ ์๊ฐ์ ์ํ๋ ํ์์ผ๋ก ๋ณํํ ์ ์์ด. ๊ฒ๋ค๊ฐ parse()
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฌธ์์ด์ ๋ ์ง/์๊ฐ ๊ฐ์ฒด๋ก ์ฝ๊ฒ ๋ณํํ ์๋ ์์ง. ์ด์ ์ ๋นํด ์ ๋ง ํธ๋ฆฌํด์ก์ง?
2.5 ์๊ฐ๋(TimeZone) ์ง์ ๊ฐ์ ๐
๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ์๊ฐ๋ ์ฒ๋ฆฌ๊ฐ ์ ๋ง ์ค์ํด์ ธ. Java 8 Date/Time API๋ ์ด๋ฐ ์๊ฐ๋ ์ฒ๋ฆฌ๋ฅผ ํจ์ฌ ์ฝ๊ณ ๋ช ํํ๊ฒ ๋ง๋ค์ด์คฌ์ด.
ZoneId
์ ZonedDateTime
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํน์ ์๊ฐ๋์ ๋ ์ง์ ์๊ฐ์ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์ด. ์๋ฅผ ๋ค์ด๋ณผ๊น?
// ํ์ฌ ์์คํ
์ ๊ธฐ๋ณธ ์๊ฐ๋ ์ฌ์ฉ
ZonedDateTime nowInSystemTZ = ZonedDateTime.now();
// ํน์ ์๊ฐ๋ ์ฌ์ฉ
ZonedDateTime nowInTokyo = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
// ์๊ฐ๋ ๋ณํ
ZonedDateTime nowInNewYork = nowInTokyo.withZoneSameInstant(ZoneId.of("America/New_York"));
// ์๊ฐ๋ ๋ชฉ๋ก ํ์ธ
Set<string> availableZoneIds = ZoneId.getAvailableZoneIds();
</string>
์ด๋ ๊ฒ ํ๋ฉด ๋ค์ํ ์๊ฐ๋์ ์๊ฐ์ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์ด. ์๊ฐ๋ ๊ฐ ๋ณํ๋ ์์ฃผ ๊ฐ๋จํ์ง? ๊ฒ๋ค๊ฐ ZoneId.getAvailableZoneIds()
๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋ ์๊ฐ๋ ๋ชฉ๋ก์ ์ป์ ์ ์์ด์ ํธ๋ฆฌํด.
2.6 ISO-8601 ํ์ค ์ค์ ๐
Java 8 Date/Time API๋ ๊ตญ์ ํ์ค์ธ ISO-8601์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฐ๋ฅด๊ณ ์์ด. ์ด ํ์ค์ ๋ ์ง์ ์๊ฐ์ ํํํ๋ ๊ตญ์ ์ ์ธ ๊ท์ฝ์ด์ผ. ์ด๋ ๊ฒ ํ์ค์ ๋ฐ๋ฅด๋ฉด ๋ญ๊ฐ ์ข์๊น?
- ๋ค๋ฅธ ์์คํ ๊ณผ์ ํธํ์ฑ์ด ์ข์์ ธ ๐
- ๋ ์ง์ ์๊ฐ ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ด ๐
- ๊ตญ์ ํ(i18n)์ ์ง์ญํ(l10n)๊ฐ ์ฌ์์ ธ ๐
์๋ฅผ ๋ค์ด, LocalDate
๋ LocalDateTime
์ ๋ฌธ์์ด๋ก ๋ณํํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ISO-8601 ํ์์ ๋ฐ๋ผ๊ฐ:
LocalDate date = LocalDate.of(2023, 6, 15);
System.out.println(date); // 2023-06-15
LocalDateTime dateTime = LocalDateTime.of(2023, 6, 15, 14, 30, 0);
System.out.println(dateTime); // 2023-06-15T14:30:00
์ด๋ ๊ฒ ํ์ค์ ๋ฐ๋ฅด๋ฉด ๋ค๋ฅธ ์์คํ ์ด๋ ์ธ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ํจ์ฌ ์์ํด์ ธ. ํนํ ์น ์๋น์ค๋ RESTful API๋ฅผ ๊ฐ๋ฐํ ๋ ์์ฃผ ์ ์ฉํ์ง.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Java 8 Date/Time API์ ์ฃผ์ ํน์ง๋ค์ด์ผ. ์ ๋ง ๋ง์ ๊ฐ์ ์ด ์ด๋ค์ก์ง? ์ด์ ์ ๋นํด ์ผ๋ง๋ ํธ๋ฆฌํด์ก๋์ง ๋๊ปด์ง์ง ์์? ๐
์ด์ ์ฐ๋ฆฌ๋ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ด. ๊ทธ๋ผ ์ด๊ฑธ ์ด๋ป๊ฒ ์ค์ ๋ก ํ์ฉํ ์ ์์๊น? ๋ค์ ์น์ ์์ ์์ธํ ์์๋ณด์! ์ฌ๋ฅ๋ท์์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ์๋ฅผ ๋ค์ผ๋ฉด์ ๋ฐฐ์ด ๋ด์ฉ์ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณผ ์ ์์ ๊ฑฐ์ผ. ๊ณ์ํด์ ํจ๊ป ์์๋ณด์! ๐
3. Java 8 Date/Time API ์ค์ ํ์ฉํ๊ธฐ ๐ช
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ์ด๋ก ์ ์ค์ ๋ก ํ์ฉํด๋ณผ ์๊ฐ์ด์ผ! ๐ Java 8 Date/Time API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง์ ์๊ฐ ๊ด๋ จ ์์ ์ ์ ๋ง ์ฝ๊ณ ํจ์จ์ ์ผ๋ก ํ ์ ์์ด. ์ค์ ํ๋ก๊ทธ๋๋ฐ์์ ์์ฃผ ๋ง์ฃผ์น๋ ์ํฉ๋ค์ ์๋ก ๋ค์ด๊ฐ๋ฉฐ ์ค๋ช ํด๋ณผ๊ฒ. ์ค๋น๋์ด? ๊ทธ๋ผ ์์ํด๋ณผ๊น! ๐
3.1 ํ์ฌ ๋ ์ง์ ์๊ฐ ๊ตฌํ๊ธฐ ๐ โฐ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์์ ๋ถํฐ ์์ํด๋ณผ๊น? ํ์ฌ ๋ ์ง์ ์๊ฐ์ ๊ตฌํ๋ ๊ฑด ์ ๋ง ๊ฐ๋จํด!
// ํ์ฌ ๋ ์ง ๊ตฌํ๊ธฐ
LocalDate today = LocalDate.now();
System.out.println("์ค๋ ๋ ์ง: " + today);
// ํ์ฌ ์๊ฐ ๊ตฌํ๊ธฐ
LocalTime now = LocalTime.now();
System.out.println("ํ์ฌ ์๊ฐ: " + now);
// ํ์ฌ ๋ ์ง์ ์๊ฐ ๊ตฌํ๊ธฐ
LocalDateTime currentDateTime = LocalDateTime.now();
System.out.println("ํ์ฌ ๋ ์ง์ ์๊ฐ: " + currentDateTime);
// ํน์ ์๊ฐ๋์ ํ์ฌ ๋ ์ง์ ์๊ฐ ๊ตฌํ๊ธฐ
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println("๋์ฟ ํ์ฌ ์๊ฐ: " + tokyoTime);
์! ์ ๋ง ์ง๊ด์ ์ด๊ณ ์ฝ์ง? ์ด์ ์ Calendar
๋ Date
๋ฅผ ์ฌ์ฉํ ๋์๋ ๋น๊ต๋ ์ ๋๊ฒ ๊ฐ๋จํด์ก์ด.
3.2 ํน์ ๋ ์ง/์๊ฐ ์์ฑํ๊ธฐ ๐
ํน์ ๋ ์ง๋ ์๊ฐ์ ์์ฑํ๋ ๊ฒ๋ ์์ฃผ ์ฌ์. ์๋ฅผ ๋ค์ด, ๋ค ์์ผ์ด๋ ์ฝ์ ์๊ฐ ๊ฐ์ ๊ฑธ ํํํ ๋ ์ฌ์ฉํ ์ ์์ง.
// ํน์ ๋ ์ง ์์ฑ
LocalDate birthday = LocalDate.of(1990, 1, 1);
System.out.println("์์ผ: " + birthday);
// ํน์ ์๊ฐ ์์ฑ
LocalTime appointmentTime = LocalTime.of(14, 30);
System.out.println("์ฝ์ ์๊ฐ: " + appointmentTime);
// ํน์ ๋ ์ง์ ์๊ฐ ์์ฑ
LocalDateTime eventDateTime = LocalDateTime.of(2023, 12, 25, 18, 0);
System.out.println("์ด๋ฒคํธ ์ผ์: " + eventDateTime);
์ด๋ ๊ฒ ํ๋ฉด ์ํ๋ ๋ ์ง์ ์๊ฐ์ ์์ฃผ ๋ช ํํ๊ฒ ํํํ ์ ์์ด. ๊ฒ๋ค๊ฐ ๊ฐ๋ ์ฑ๋ ์ข์ง?
3.3 ๋ ์ง์ ์๊ฐ ์กฐ์ํ๊ธฐ ๐ง
๋ ์ง๋ ์๊ฐ์ ๋ณ๊ฒฝํ๊ฑฐ๋ ๊ณ์ฐํด์ผ ํ ๋๊ฐ ๋ง์ง? Java 8 Date/Time API๋ฅผ ์ฌ์ฉํ๋ฉด ์ด๋ฐ ์์ ๋ ์์ฃผ ์ฝ๊ณ ์ง๊ด์ ์ผ๋ก ํ ์ ์์ด.
LocalDate today = LocalDate.now();
// ๋ ์ง ๋ํ๊ธฐ
LocalDate nextWeek = today.plusWeeks(1);
System.out.println("์ผ์ฃผ์ผ ํ: " + nextWeek);
// ๋ ์ง ๋นผ๊ธฐ
LocalDate lastMonth = today.minusMonths(1);
System.out.println("ํ ๋ฌ ์ : " + lastMonth);
// ํน์ ํ๋ ๋ณ๊ฒฝ
LocalDate firstDayOfMonth = today.withDayOfMonth(1);
System.out.println("์ด๋ฒ ๋ฌ์ ์ฒซ ๋ : " + firstDayOfMonth);
LocalTime now = LocalTime.now();
// ์๊ฐ ๋ํ๊ธฐ
LocalTime twoHoursLater = now.plusHours( 2);
System.out.println("2์๊ฐ ํ: " + twoHoursLater);
// ์๊ฐ ๋นผ๊ธฐ
LocalTime tenMinutesBefore = now.minusMinutes(10);
System.out.println("10๋ถ ์ : " + tenMinutesBefore);
// ํน์ ํ๋ ๋ณ๊ฒฝ
LocalTime setToNoon = now.withHour(12).withMinute(0).withSecond(0);
System.out.println("์ ์ค๋ก ์ค์ : " + setToNoon);
๋ณด์ด์ง? ๋ ์ง์ ์๊ฐ์ ๋ํ๊ณ , ๋นผ๊ณ , ํน์ ๋ถ๋ถ์ ๋ณ๊ฒฝํ๋ ๊ฒ ์ผ๋ง๋ ์ง๊ด์ ์ด๊ณ ์ฌ์์ก๋์ง! ๐ ์ด์ ์๋ ์ด๋ฐ ์์ ์ ํ ๋๋ง๋ค ๋ณต์กํ ๊ณ์ฐ์ ํด์ผ ํ๋๋ฐ, ์ด์ ๋ ๊ทธ๋ด ํ์๊ฐ ์์ด์ก์ด.
3.4 ๋ ์ง์ ์๊ฐ ๋น๊ตํ๊ธฐ ๐
๋ ๋ ์ง๋ ์๊ฐ์ ๋น๊ตํด์ผ ํ ๋๋ ์์ง? ์๋ฅผ ๋ค์ด, ์ด๋ค ๋ ์ง๊ฐ ๋ ์ด์ ์ธ์ง, ํน์ ๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉ์ด ์ผ๋ง๋ ๋๋์ง ์๊ณ ์ถ์ ๋ ๋ง์ด์ผ. Java 8 Date/Time API๋ ์ด๋ฐ ์์ ๋ ์์ฃผ ์ฝ๊ฒ ํ ์ ์๊ฒ ํด์ค.
LocalDate date1 = LocalDate.of(2023, 6, 1);
LocalDate date2 = LocalDate.of(2023, 6, 15);
// ๋ ์ง ๋น๊ต
boolean isBefore = date1.isBefore(date2);
System.out.println("date1์ด date2๋ณด๋ค ์ด์ ์ธ๊ฐ์? " + isBefore);
// ๋ ์ง ๊ฐ ์ฐจ์ด ๊ณ์ฐ
Period period = Period.between(date1, date2);
System.out.println("๋ ๋ ์ง ์ฌ์ด์ ๊ธฐ๊ฐ: " + period.getDays() + "์ผ");
LocalTime time1 = LocalTime.of(9, 0);
LocalTime time2 = LocalTime.of(17, 30);
// ์๊ฐ ๋น๊ต
boolean isAfter = time2.isAfter(time1);
System.out.println("time2๊ฐ time1๋ณด๋ค ์ดํ์ธ๊ฐ์? " + isAfter);
// ์๊ฐ ๊ฐ ์ฐจ์ด ๊ณ์ฐ
Duration duration = Duration.between(time1, time2);
System.out.println("๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉ: " + duration.toHours() + "์๊ฐ " + duration.toMinutesPart() + "๋ถ");
์! ๋ ์ง์ ์๊ฐ์ ๋น๊ตํ๊ณ ๊ทธ ์ฐจ์ด๋ฅผ ๊ณ์ฐํ๋ ๊ฒ ์ด๋ ๊ฒ ์ฌ์์ก์ด. ํนํ Period
์ Duration
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง๋ ์๊ฐ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ์์ฃผ ์ธ๋ฐํ๊ฒ ๊ณ์ฐํ ์ ์์ง.
3.5 ๋ ์ง์ ์๊ฐ ํ์ฑ ๋ฐ ํฌ๋งคํ ๐จ
๋ฌธ์์ด์ ๋ ์ง/์๊ฐ ๊ฐ์ฒด๋ก ๋ณํํ๊ฑฐ๋, ๋ฐ๋๋ก ๋ ์ง/์๊ฐ ๊ฐ์ฒด๋ฅผ ์ํ๋ ํ์์ ๋ฌธ์์ด๋ก ๋ณํํด์ผ ํ ๋๊ฐ ๋ง์ง? Java 8 Date/Time API๋ ์ด๋ฐ ์์ ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ ๊ณตํด.
// ๋ฌธ์์ด์ ๋ ์ง๋ก ํ์ฑ
LocalDate parsedDate = LocalDate.parse("2023-06-15");
System.out.println("ํ์ฑ๋ ๋ ์ง: " + parsedDate);
// ๋ ์ง๋ฅผ ํน์ ํ์์ ๋ฌธ์์ด๋ก ํฌ๋งคํ
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy๋
MM์ dd์ผ");
String formattedDate = parsedDate.format(formatter);
System.out.println("ํฌ๋งคํ
๋ ๋ ์ง: " + formattedDate);
// ๋ฌธ์์ด์ ์๊ฐ์ผ๋ก ํ์ฑ
LocalTime parsedTime = LocalTime.parse("14:30");
System.out.println("ํ์ฑ๋ ์๊ฐ: " + parsedTime);
// ์๊ฐ์ ํน์ ํ์์ ๋ฌธ์์ด๋ก ํฌ๋งคํ
formatter = DateTimeFormatter.ofPattern("HH์ mm๋ถ");
String formattedTime = parsedTime.format(formatter);
System.out.println("ํฌ๋งคํ
๋ ์๊ฐ: " + formattedTime);
์ด๋ ๊ฒ DateTimeFormatter
๋ฅผ ์ฌ์ฉํ๋ฉด ์ํ๋ ํ์์ผ๋ก ๋ ์ง์ ์๊ฐ์ ์์ ๋กญ๊ฒ ๋ณํํ ์ ์์ด. ํนํ ๋ค๊ตญ์ด ์ง์์ด ํ์ํ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ๋ ์ด ๊ธฐ๋ฅ์ด ์์ฃผ ์ ์ฉํ์ง!
3.6 ์๊ฐ๋ ๋ค๋ฃจ๊ธฐ ๐
๊ธ๋ก๋ฒ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค ๋ณด๋ฉด ๋ค์ํ ์๊ฐ๋๋ฅผ ๋ค๋ค์ผ ํ ๋๊ฐ ๋ง์. Java 8 Date/Time API๋ ์ด๋ฐ ์์ ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ค์ด์ค.
// ํ์ฌ ์์คํ
์ ๊ธฐ๋ณธ ์๊ฐ๋ ํ์ธ
ZoneId systemZone = ZoneId.systemDefault();
System.out.println("์์คํ
๊ธฐ๋ณธ ์๊ฐ๋: " + systemZone);
// ํน์ ์๊ฐ๋์ ํ์ฌ ์๊ฐ ๊ตฌํ๊ธฐ
ZonedDateTime tokyoTime = ZonedDateTime.now(ZoneId.of("Asia/Tokyo"));
System.out.println("๋์ฟ ํ์ฌ ์๊ฐ: " + tokyoTime);
// ์๊ฐ๋ ๋ณํ
ZonedDateTime newYorkTime = tokyoTime.withZoneSameInstant(ZoneId.of("America/New_York"));
System.out.println("๋ด์ ์๊ฐ์ผ๋ก ๋ณํ: " + newYorkTime);
// ์ฌ์ฉ ๊ฐ๋ฅํ ์๊ฐ๋ ๋ชฉ๋ก ํ์ธ
Set<string> availableZoneIds = ZoneId.getAvailableZoneIds();
System.out.println("์ฌ์ฉ ๊ฐ๋ฅํ ์๊ฐ๋ ์: " + availableZoneIds.size());
</string>
์ด๋ ๊ฒ ํ๋ฉด ๋ค์ํ ์๊ฐ๋์ ์๊ฐ์ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์์ด. ํนํ ZonedDateTime
์ ์ฌ์ฉํ๋ฉด ์๊ฐ๋ ๊ฐ ๋ณํ์ด ์์ฃผ ๊ฐ๋จํด์ง์ง.
3.7 ์ค์ ์์ : ์ผ์ ๊ด๋ฆฌ ์์คํ ๐
์, ์ด์ ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๋ด์ฉ์ ์ข ํฉํด์ ๊ฐ๋จํ ์ผ์ ๊ด๋ฆฌ ์์คํ ์ ๋ง๋ค์ด๋ณผ๊น? ์ด ์์คํ ์ ์ผ์ ์ ์ถ๊ฐํ๊ณ , ๋ค๊ฐ์ค๋ ์ผ์ ์ ํ์ธํ๊ณ , ์ผ์ ๊ฐ์ ๊ฐ๊ฒฉ์ ๊ณ์ฐํ๋ ๊ธฐ๋ฅ์ ๊ฐ์ง ๊ฑฐ์ผ.
import java.time.*;
import java.time.format.*;
import java.util.*;
public class ScheduleManager {
private List<localdatetime> schedules = new ArrayList<>();
private DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
public void addSchedule(String dateTimeStr) {
LocalDateTime dateTime = LocalDateTime.parse(dateTimeStr, formatter);
schedules.add(dateTime);
System.out.println("์ผ์ ์ด ์ถ๊ฐ๋์์ต๋๋ค: " + dateTime.format(formatter));
}
public void showUpcomingSchedules() {
LocalDateTime now = LocalDateTime.now();
System.out.println("๋ค๊ฐ์ค๋ ์ผ์ :");
schedules.stream()
.filter(schedule -> schedule.isAfter(now))
.sorted()
.forEach(schedule -> System.out.println(schedule.format(formatter)));
}
public void calculateIntervalBetweenSchedules() {
if (schedules.size() < 2) {
System.out.println("์ผ์ ์ด 2๊ฐ ์ด์ ํ์ํฉ๋๋ค.");
return;
}
Collections.sort(schedules);
for (int i = 0; i < schedules.size() - 1; i++) {
LocalDateTime schedule1 = schedules.get(i);
LocalDateTime schedule2 = schedules.get(i + 1);
Duration duration = Duration.between(schedule1, schedule2);
System.out.println("์ผ์ ๊ฐ ๊ฐ๊ฒฉ: " + duration.toDays() + "์ผ " + duration.toHoursPart() + "์๊ฐ " + duration.toMinutesPart() + "๋ถ");
}
}
public static void main(String[] args) {
ScheduleManager manager = new ScheduleManager();
manager.addSchedule("2023-06-20 14:00");
manager.addSchedule("2023-06-25 10:30");
manager.addSchedule("2023-07-01 09:00");
manager.showUpcomingSchedules();
manager.calculateIntervalBetweenSchedules();
}
}
</localdatetime>
์ด ์์ ์์ ์ฐ๋ฆฌ๋ Java 8 Date/Time API์ ์ฌ๋ฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ด:
LocalDateTime
์ ์ฌ์ฉํด ๋ ์ง์ ์๊ฐ์ ํจ๊ป ํํํ์ด.DateTimeFormatter
๋ฅผ ์ฌ์ฉํด ๋ฌธ์์ด๊ณผLocalDateTime
๊ฐ์ฒด ๊ฐ์ ๋ณํ์ ์ํํ์ง.isAfter()
๋ฉ์๋๋ก ํ์ฌ ์๊ฐ ์ดํ์ ์ผ์ ๋ง ํํฐ๋งํ์ด.Duration
์ ์ฌ์ฉํด ๋ ์ผ์ ์ฌ์ด์ ๊ฐ๊ฒฉ์ ๊ณ์ฐํ์ง.
์ด๋ ๊ฒ Java 8 Date/Time API๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง์ ์๊ฐ ๊ด๋ จ ์์ ์ ํจ์ฌ ๋ ์ฝ๊ณ ๋ช ํํ๊ฒ ์ฒ๋ฆฌํ ์ ์์ด. ํนํ ๋ถ๋ณ์ฑ์ ๊ฐ์ถ ๊ฐ์ฒด๋ค์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ์์ ํ๊ฒ ์ฌ์ฉํ ์ ์์ง.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Java 8 Date/Time API์ ์ค์ ํ์ฉ๋ฒ์ด์ผ. ์ด๋? ์๊ฐ๋ณด๋ค ์ฝ์ง? ๐ ์ด์ ๋๋ ์ด ๊ฐ๋ ฅํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํด์ ๋ ์ง์ ์๊ฐ ๊ด๋ จ ์์ ์ ์์ ์๊ฒ ์ฒ๋ฆฌํ ์ ์์ ๊ฑฐ์ผ. ๊ณ์ํด์ ์ฐ์ตํ๊ณ ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๋ฉด ๋ ๊น์ด ์ดํดํ ์ ์์ ๊ฑฐ์ผ. ํ์ดํ ! ๐
4. Java 8 Date/Time API ์ฌ์ฉ ์ ์ฃผ์์ฌํญ ๋ฐ ํ ๐จ๐ก
์, ์ด์ Java 8 Date/Time API์ ๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์์์ผ๋, ์ด๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ฃผ์์ฌํญ๊ณผ ํ์ ์์๋ณผ๊น? ์ด๋ฐ ๋ด์ฉ๋ค์ ์๊ณ ์์ผ๋ฉด ๋ ๊น๋ํ๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ ๊ฑฐ์ผ. ์ค๋น๋์ด? ๊ทธ๋ผ ์์ํด๋ณผ๊น! ๐
4.1 ๋ ๊ฑฐ์ ์ฝ๋์์ ํธํ์ฑ ๐
Java 8 ์ด์ ์ ์ฝ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจ๊ป ์์ ํด์ผ ํ ๋๊ฐ ์์ ๊ฑฐ์ผ. ์ด๋ด ๋๋ ์๋ก์ด API์ ์ด์ API ์ฌ์ด์ ๋ณํ์ด ํ์ํด.
// java.util.Date๋ฅผ Instant๋ก ๋ณํ
Date legacyDate = new Date();
Instant instant = legacyDate.toInstant();
// Instant๋ฅผ java.util.Date๋ก ๋ณํ
Date newDate = Date.from(instant);
// java.util.Calendar๋ฅผ ZonedDateTime์ผ๋ก ๋ณํ
Calendar calendar = Calendar.getInstance();
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(calendar.toInstant(), calendar.getTimeZone().toZoneId());
// ZonedDateTime์ java.util.Calendar๋ก ๋ณํ
Calendar newCalendar = GregorianCalendar.from(zonedDateTime);
์ด๋ ๊ฒ ํ๋ฉด ์๋ก์ด API์ ์ด์ API ์ฌ์ด๋ฅผ ์์ ๋กญ๊ฒ ์ค๊ฐ ์ ์์ด. ํ์ง๋ง ๊ฐ๋ฅํ๋ค๋ฉด ์๋ก์ด API๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์. ๋ ์์ ํ๊ณ ์ฌ์ฉํ๊ธฐ ํธ๋ฆฌํ๊ฑฐ๋ .
4.2 ์๊ฐ๋ ์ฒ๋ฆฌ ์ ์ฃผ์์ฌํญ ๐
์๊ฐ๋๋ฅผ ๋ค๋ฃฐ ๋๋ ํนํ ์ฃผ์ํด์ผ ํด. ๋ช ๊ฐ์ง ์ค์ํ ํฌ์ธํธ๋ฅผ ์ดํด๋ณผ๊น?
- ๊ฐ๋ฅํ๋ฉด ํญ์ UTC(Coordinated Universal Time)๋ฅผ ์ฌ์ฉํด ์๊ฐ์ ์ ์ฅํ๊ณ , ํ์ํ ๋๋ง ๋ก์ปฌ ์๊ฐ๋๋ก ๋ณํํด.
- ์๊ฐ๋ ์ด๋ฆ์ ํ๋์ฝ๋ฉํ์ง ๋ง. ๋์
ZoneId.of()
๋ฅผ ์ฌ์ฉํด. - ์ผ๊ด ์ ์ฝ ์๊ฐ์ (DST)๋ฅผ ๊ณ ๋ คํด์ผ ํด.
ZonedDateTime
์ ์ฌ์ฉํ๋ฉด ์ด๋ฅผ ์๋์ผ๋ก ์ฒ๋ฆฌํด์ค.
// UTC ์๊ฐ ์ ์ฅ
Instant utcTime = Instant.now();
// ํ์ํ ๋ ๋ก์ปฌ ์๊ฐ๋๋ก ๋ณํ
ZonedDateTime localTime = utcTime.atZone(ZoneId.systemDefault());
// ์๊ฐ๋ ์ด๋ฆ ์ฌ์ฉ (ํ๋์ฝ๋ฉ ๋์ )
ZoneId newYorkZone = ZoneId.of("America/New_York");
// DST ๊ณ ๋ ค (3์์ ๋ง์ง๋ง ์ผ์์ผ ์๋ฒฝ 2์)
ZonedDateTime dstStart = ZonedDateTime.of(2023, 3, 26, 2, 0, 0, 0, newYorkZone);
ZonedDateTime hourLater = dstStart.plusHours(1);
System.out.println("DST ์์ ์๊ฐ: " + dstStart);
System.out.println("1์๊ฐ ํ: " + hourLater);
์ด๋ ๊ฒ ํ๋ฉด ์๊ฐ๋ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ๋ง์ด ์ค์ผ ์ ์์ด.
4.3 ์ฑ๋ฅ ๊ณ ๋ ค์ฌํญ ๐
Java 8 Date/Time API๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ถฉ๋ถํ ๋น ๋ฅด์ง๋ง, ์ฑ๋ฅ์ด ์ค์ํ ์ํฉ์์๋ ๋ช ๊ฐ์ง ๊ณ ๋ คํด์ผ ํ ์ ์ด ์์ด.
- ๋ฐ๋ณต๋ฌธ ์์์
now()
๋ฉ์๋๋ฅผ ๋ฐ๋ณตํด์ ํธ์ถํ์ง ๋ง. ๋์ ๋ฃจํ ๋ฐ์์ ํ ๋ฒ๋ง ํธ์ถํ๊ณ ๊ทธ ๊ฐ์ ์ฌ์ฉํด. - ๋ถํ์ํ ๊ฐ์ฒด ์์ฑ์ ํผํด. ์๋ฅผ ๋ค์ด, ํฌ๋งคํฐ๋ ์ฌ์ฌ์ฉํ ์ ์์ด.
- ์๊ฐ ๋น๊ต ์
isBefore()
,isAfter()
,isEqual()
๋ฉ์๋๋ฅผ ์ฌ์ฉํด. ์ด๋ค์ดcompareTo()
๋ณด๋ค ๋ ๋ช ํํ๊ณ ์ฝ๊ฐ ๋ ๋นจ๋ผ.
// ์ข์ ์
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate now = LocalDate.now();
for (LocalDate date : dates) {
if (date.isBefore(now)) {
String formatted = date.format(formatter);
// ์์
์ํ
}
}
// ๋์ ์
for (LocalDate date : dates) {
if (date.isBefore(LocalDate.now())) { // ๋งค๋ฒ now()๋ฅผ ํธ์ถ
String formatted = date.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); // ๋งค๋ฒ ์ ํฌ๋งคํฐ ์์ฑ
// ์์
์ํ
}
}
์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ์ฑ๋ฅ์ ์กฐ๊ธ ๋ ๊ฐ์ ํ ์ ์์ด.
4.4 ๋ ์ง ์ฐ์ฐ ์ ์ฃผ์์ฌํญ ๐
๋ ์ง๋ฅผ ๋ํ๊ฑฐ๋ ๋บ ๋ ์ฃผ์ํด์ผ ํ ์ ์ด ์์ด. ํนํ ์์ด๋ ๋ ์ ๋ํ๊ฑฐ๋ ๋บ ๋ ์์์น ๋ชปํ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ์ ์์ด.
LocalDate date = LocalDate.of(2024, 1, 31); // 2024๋
1์ 31์ผ
LocalDate oneMonthLater = date.plusMonths(1);
System.out.println(oneMonthLater); // 2024-02-29 ์ถ๋ ฅ
LocalDate twoMonthsLater = date.plusMonths(2);
System.out.println(twoMonthsLater); // 2024-03-31 ์ถ๋ ฅ
๋ณด์ด์ง? 1์ 31์ผ์์ ํ ๋ฌ์ ๋ํ์ ๋ 2์ 29์ผ์ด ๋์ด. ์ด๋ 2024๋ ์ด ์ค๋ ์ด๊ธฐ ๋๋ฌธ์ด์ผ. ์ด๋ฐ ๋์์ด ์๋ํ ๋๋ก์ธ์ง ํญ์ ํ์ธํด์ผ ํด.
4.5 ๋ถ๋ณ์ฑ(Immutability) ํ์ฉํ๊ธฐ ๐ก๏ธ
Java 8 Date/Time API์ ๋ชจ๋ ํด๋์ค๋ ๋ถ๋ณ์ด์ผ. ์ด ํน์ฑ์ ์ ํ์ฉํ๋ฉด ๋ ์์ ํ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด.
// ์ข์ ์
LocalDate date = LocalDate.of(2023, 6, 15);
LocalDate newDate = date.plusDays(1); // ์๋ก์ด ๊ฐ์ฒด ์์ฑ
// ๋์ ์ (ํ์ง๋ง ์ปดํ์ผ ์๋ฌ๋ ์๋)
LocalDate date = LocalDate.of(2023, 6, 15);
date.plusDays(1); // ๊ฒฐ๊ณผ๋ฅผ ์ฌ์ฉํ์ง ์์
System.out.println(date); // ์ฌ์ ํ 2023-06-15 ์ถ๋ ฅ
๋ ์ง๋ ์๊ฐ์ ๋ณ๊ฒฝํ๋ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋๋ ํญ์ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ณ์์ ํ ๋นํ๊ฑฐ๋, ๊ฐ์ ๋ณ์์ ์ฌํ ๋นํด์ผ ํด. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ณ๊ฒฝ ์ฌํญ์ด ์ ์ฉ๋์ง ์์.
4.6 ๋ฌธ์์ด ํ์ฑ ์ ์ฃผ์์ฌํญ ๐
๋ฌธ์์ด์ ๋ ์ง/์๊ฐ ๊ฐ์ฒด๋ก ํ์ฑํ ๋๋ ์์ธ ์ฒ๋ฆฌ๋ฅผ ์์ง ๋ง. DateTimeParseException
์ด ๋ฐ์ํ ์ ์๊ฑฐ๋ .
try {
LocalDate date = LocalDate.parse("2023-06-15");
System.out.println(date);
} catch (DateTimeParseException e) {
System.out.println("๋ ์ง ํ์์ด ์ฌ๋ฐ๋ฅด์ง ์์ต๋๋ค: " + e.getMessage());
}
๋ํ, ๊ฐ๋ฅํ๋ฉด ๋ฏธ๋ฆฌ ์ ์๋ ํฌ๋งคํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ข์. ์ปค์คํ
ํฌ๋งคํฐ๋ฅผ ๋ง๋ค ๋๋ DateTimeFormatterBuilder
๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ธ๋ฐํ ์ ์ด๊ฐ ๊ฐ๋ฅํด.
4.7 ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฐ๋ ๐พ
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฐ๋ํ ๋๋ JDBC 4.2 ์ด์์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์. ์ด ๋ฒ์ ๋ถํฐ Java 8 Date/Time API์ ํธํ๋๋ ๋ฉ์๋๋ฅผ ์ ๊ณตํ๊ฑฐ๋ .
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ ์ฅ
LocalDateTime now = LocalDateTime.now();
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (event_time) VALUES (?)");
pstmt.setObject(1, now);
pstmt.executeUpdate();
// ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ฝ๊ธฐ
ResultSet rs = stmt.executeQuery("SELECT event_time FROM events");
while (rs.next()) {
LocalDateTime eventTime = rs.getObject("event_time", LocalDateTime.class);
System.out.println(eventTime);
}
์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ Java ์ฝ๋ ์ฌ์ด์์ ๋ ์ง์ ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฃผ๊ณ ๋ฐ์ ์ ์์ด.
4.8 ํ ์คํธ ์ ๊ณ ๋ ค์ฌํญ ๐งช
๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ ์ฝ๋๋ฅผ ํ
์คํธํ ๋๋ ํ์ฌ ์๊ฐ์ ์์กดํ์ง ์๋๋ก ์ฃผ์ํด์ผ ํด. Clock
ํด๋์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ
์คํธํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ด.
public class TimeService {
private Clock clock;
public TimeService(Clock clock) {
this.clock = clock;
}
public LocalDateTime getCurrentTime() {
return LocalDateTime.now(clock);
}
}
// ํ
์คํธ ์ฝ๋
@Test
public void testGetCurrentTime() {
Clock fixedClock = Clock.fixed(Instant.parse("2023-06-15T10:15:30Z"), ZoneId.of("UTC"));
TimeService timeService = new TimeService(fixedClock);
assertEquals(LocalDateTime.parse("2023-06-15T10:15:30"), timeService.getCurrentTime());
}
์ด๋ ๊ฒ ํ๋ฉด ํ์ฌ ์๊ฐ์ ์๊ด์์ด ํญ์ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์์ด, ํ ์คํธ์ ์์ ์ฑ์ด ๋์์ง์ง.
์, ์ฌ๊ธฐ๊น์ง๊ฐ Java 8 Date/Time API๋ฅผ ์ฌ์ฉํ ๋ ์์๋๋ฉด ์ข์ ์ฃผ์์ฌํญ๊ณผ ํ๋ค์ด์ผ. ์ด๋ฐ ๋ด์ฉ๋ค์ ์ ๊ธฐ์ตํ๊ณ ์ ์ฉํ๋ฉด, ๋ ์์ ํ๊ณ ํจ์จ์ ์ธ ๋ ์ง/์๊ฐ ๊ด๋ จ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ ๊ฑฐ์ผ. ๊ณ์ํด์ ์ค์ตํ๊ณ ๊ฒฝํ์ ์์๊ฐ๋ฉด์ ์ด ๊ฐ๋ ฅํ API๋ฅผ ๋ง์คํฐํด๋๊ฐ๊ธธ ๋ฐ๋ผ! ํ์ดํ ! ๐ช๐
5. ๊ฒฐ๋ก ๋ฐ ๋ง๋ฌด๋ฆฌ ๐ฌ
์, ์ฌ๊ธฐ๊น์ง ์์ด! Java 8 Date/Time API์ ๋ํด ์ ๋ง ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ง? ์ด์ ์ฐ๋ฆฌ์ ์ฌ์ ์ ๋ง๋ฌด๋ฆฌ ์ง์ด๋ณผ๊น? ๐
5.1 ์ฐ๋ฆฌ๊ฐ ๋ฐฐ์ด ๊ฒ ๐
์ฐ๋ฆฌ๋ ์ด ๊ธด ์ฌ์ ์ ํตํด ์ ๋ง ๋ง์ ๊ฒ์ ๋ฐฐ์ ์ด:
- Java 8 ์ด์ ์ ๋ ์ง/์๊ฐ API์ ๋ฌธ์ ์
- Java 8 Date/Time API์ ์ฃผ์ ํน์ง๊ณผ ์ฅ์
- ์๋ก์ด API์ ํต์ฌ ํด๋์ค๋ค (
LocalDate
,LocalTime
,LocalDateTime
,ZonedDateTime
,Instant
๋ฑ) - ๋ ์ง์ ์๊ฐ์ ๋ค๋ฃจ๋ ๋ค์ํ ๋ฐฉ๋ฒ (์์ฑ, ์กฐ์, ๋น๊ต, ํฌ๋งคํ ๋ฑ)
- ์๊ฐ๋ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ
- API ์ฌ์ฉ ์ ์ฃผ์์ฌํญ๊ณผ ํ
์! ์ ๋ง ๋ง์ด ๋ฐฐ์ ๋ค, ๊ทธ๋ ์ง? ๐
5.2 Java 8 Date/Time API์ ์ค์์ฑ ๐
์ด ์๋ก์ด API๊ฐ ์ ๊ทธ๋ ๊ฒ ์ค์ํ ๊น? ๋ช ๊ฐ์ง ์ด์ ๋ฅผ ์ ๋ฆฌํด๋ณผ๊ฒ:
- ์์ ์ฑ: ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํด ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํด.
- ๋ช ํ์ฑ: ์ง๊ด์ ์ธ ๋ฉ์๋ ์ด๋ฆ๊ณผ ์ผ๊ด๋ ๋์์ธ์ผ๋ก ์ฝ๋์ ๊ฐ๋ ์ฑ์ ๋์ฌ์ค.
- ๊ธฐ๋ฅ์ฑ: ๋ค์ํ ๋ ์ง/์๊ฐ ๊ด๋ จ ์ฐ์ฐ๊ณผ ๋ณํ์ ์ฝ๊ฒ ์ํํ ์ ์์ด.
- ๊ตญ์ ํ: ์๊ฐ๋ ์ฒ๋ฆฌ๊ฐ ํจ์ฌ ์ฌ์์ ธ์ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ด ํธ๋ฆฌํด์ก์ด.
- ํ์ฅ์ฑ: ํ์์ ๋ฐ๋ผ ์ปค์คํ ํ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ถ๊ฐํ ์ ์๋ ์ ์ฐํ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ด.
์ด๋ฐ ํน์ง๋ค ๋๋ถ์ Java 8 Date/Time API๋ ํ๋์ ์ธ Java ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ํ์์ ์ธ ๋๊ตฌ๊ฐ ๋์ด.
5.3 ์์ผ๋ก์ ํ์ต ๋ฐฉํฅ ๐
์ฌ๊ธฐ์ ๋ฐฐ์ด ๋ด์ฉ์ ์์์ผ ๋ฟ์ด์ผ. ๋ ๊น์ด ์๋ ํ์ต์ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ ์ ์์ด:
- ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๊ธฐ: ์ด๋ก ์ ์๋ ๊ฒ๊ณผ ์ค์ ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ค๋ฅด๊ฑฐ๋ . ์ค์ ํ๋ก์ ํธ์ ์ ์ฉํด๋ณด๋ฉด์ ๊ฒฝํ์ ์์๊ฐ๋ด.
- ๊ณ ๊ธ ๊ธฐ๋ฅ ํ๊ตฌํ๊ธฐ:
TemporalAdjusters
,DateTimeFormatterBuilder
๋ฑ ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ๋ค์ ํ์ตํด๋ด. - ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํตํฉ: Spring Framework, Hibernate ๋ฑ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค๊ณผ Java 8 Date/Time API๋ฅผ ์ด๋ป๊ฒ ํจ๊ป ์ฌ์ฉํ ์ ์๋์ง ์์๋ด.
- ์ฑ๋ฅ ์ต์ ํ: ๋๊ท๋ชจ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ Date/Time API๋ฅผ ์ด๋ป๊ฒ ์ต์ ํํ ์ ์๋์ง ์ฐ๊ตฌํด๋ด.
- Java 9 ์ดํ์ ๋ณํ ์ดํด๋ณด๊ธฐ: Java 9 ์ดํ ๋ฒ์ ์์ Date/Time API์ ์ด๋ค ๋ณํ๊ฐ ์์๋์ง ํ์ธํด๋ด.
5.4 ๋ง๋ฌด๋ฆฌ ์ธ์ฌ ๐
์, ์ด์ ์ ๋ง ๋์ด์ผ. ๊ธด ์ฌ์ ์ด์์ง ๋ง? ํ์ง๋ง ์ด ์ฌ์ ์ ํตํด ๋๋ Java 8 Date/Time API์ ์ ๋ฌธ๊ฐ๊ฐ ๋์์ด! ๐
์ด API๋ฅผ ๋ง์คํฐํจ์ผ๋ก์จ, ๋๋ ์ด์ ๋ ์ง์ ์๊ฐ ๊ด๋ จ ์์ ์ ๋ ์ฝ๊ณ , ์์ ํ๊ณ , ํจ์จ์ ์ผ๋ก ์ํํ ์ ์๊ฒ ๋์ด. ์ด๋ ๋จ์ํ ๊ธฐ์ ์ ์ธ ์คํฌ์ ๋์ด์, ๋ ๋์ ์ํํธ์จ์ด๋ฅผ ๋ง๋ค ์ ์๋ ๋ฅ๋ ฅ์ ๊ฐ๊ฒ ๋ ๊ฑฐ์ผ.
๊ธฐ์ตํด, ํ๋ก๊ทธ๋๋ฐ์ ๊ณ์ํด์ ๋ฐฐ์ฐ๊ณ ์ฑ์ฅํ๋ ์ฌ์ ์ด์ผ. Java 8 Date/Time API๋ ๊ทธ ์ฌ์ ์ ์ค์ํ ์ด์ ํ ์ค ํ๋์ผ ๋ฟ์ด์ง. ์์ผ๋ก๋ ๊ณ์ํด์ ์๋ก์ด ๊ฒ์ ๋ฐฐ์ฐ๊ณ , ๋์ ํ๊ณ , ์ฑ์ฅํด ๋๊ฐ๊ธธ ๋ฐ๋ผ.
๋ง์ง๋ง์ผ๋ก, ์ด ๋ชจ๋ ๋ด์ฉ์ ๋๊น์ง ํจ๊ป ํด์ค ๋์๊ฒ ๋ฐ์๋ฅผ ๋ณด๋ด๊ณ ์ถ์ด ๐๐๐ ์ ๋ง ๋๋จํด! ์ด์ ๋์ ์ฝ๋์ Java 8 Date/Time API๋ฅผ ์ ์ฉํด๋ณด๋ฉด์, ๊ทธ ๅจๅ(์๋ ฅ)์ ์ง์ ๊ฒฝํํด๋ด. ๋ถ๋ช ๋์ ์ฝ๋ฉ ์ํ์ ํฐ ๋ณํ๋ฅผ ๊ฐ์ ธ๋ค์ค ๊ฑฐ์ผ.
๊ทธ๋ผ, ๋ค์์ ๋ ๋ค๋ฅธ ์ฃผ์ ๋ก ๋ง๋๊ธฐ๋ฅผ ๊ธฐ๋ํ ๊ฒ. ํญ์ ํ์ด์ด ํจ๊ปํ๊ธฐ๋ฅผ! Happy Coding! ๐๐
๊ด๋ จ ํค์๋
- ์ง์์ธ์ ์ฒ - ์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
์ง์ ์ฌ์ฐ๊ถ ๋ณดํธ ๊ณ ์ง
- ์ ์๊ถ ๋ฐ ์์ ๊ถ: ๋ณธ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ๋ ์ AI ๊ธฐ์ ๋ก ์์ฑ๋์์ผ๋ฉฐ, ๋ํ๋ฏผ๊ตญ ์ ์๊ถ๋ฒ ๋ฐ ๊ตญ์ ์ ์๊ถ ํ์ฝ์ ์ํด ๋ณดํธ๋ฉ๋๋ค.
- AI ์์ฑ ์ปจํ ์ธ ์ ๋ฒ์ ์ง์: ๋ณธ AI ์์ฑ ์ปจํ ์ธ ๋ ์ฌ๋ฅ๋ท์ ์ง์ ์ฐฝ์๋ฌผ๋ก ์ธ์ ๋๋ฉฐ, ๊ด๋ จ ๋ฒ๊ท์ ๋ฐ๋ผ ์ ์๊ถ ๋ณดํธ๋ฅผ ๋ฐ์ต๋๋ค.
- ์ฌ์ฉ ์ ํ: ์ฌ๋ฅ๋ท์ ๋ช ์์ ์๋ฉด ๋์ ์์ด ๋ณธ ์ปจํ ์ธ ๋ฅผ ๋ณต์ , ์์ , ๋ฐฐํฌ, ๋๋ ์์ ์ ์ผ๋ก ํ์ฉํ๋ ํ์๋ ์๊ฒฉํ ๊ธ์ง๋ฉ๋๋ค.
- ๋ฐ์ดํฐ ์์ง ๊ธ์ง: ๋ณธ ์ปจํ ์ธ ์ ๋ํ ๋ฌด๋จ ์คํฌ๋ํ, ํฌ๋กค๋ง, ๋ฐ ์๋ํ๋ ๋ฐ์ดํฐ ์์ง์ ๋ฒ์ ์ ์ฌ์ ๋์์ด ๋ฉ๋๋ค.
- AI ํ์ต ์ ํ: ์ฌ๋ฅ๋ท์ AI ์์ฑ ์ปจํ ์ธ ๋ฅผ ํ AI ๋ชจ๋ธ ํ์ต์ ๋ฌด๋จ ์ฌ์ฉํ๋ ํ์๋ ๊ธ์ง๋๋ฉฐ, ์ด๋ ์ง์ ์ฌ์ฐ๊ถ ์นจํด๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
์ฌ๋ฅ๋ท์ ์ต์ AI ๊ธฐ์ ๊ณผ ๋ฒ๋ฅ ์ ๊ธฐ๋ฐํ์ฌ ์์ฌ์ ์ง์ ์ฌ์ฐ๊ถ์ ์ ๊ทน์ ์ผ๋ก ๋ณดํธํ๋ฉฐ,
๋ฌด๋จ ์ฌ์ฉ ๋ฐ ์นจํด ํ์์ ๋ํด ๋ฒ์ ๋์์ ํ ๊ถ๋ฆฌ๋ฅผ ๋ณด์ ํฉ๋๋ค.
ยฉ 2025 ์ฌ๋ฅ๋ท | All rights reserved.
๋๊ธ 0๊ฐ