JavaRush /Java Blog /Random-KO /์ž๋ฐ” 8 ๊ฐ€์ด๋“œ. 2 ๋ถ€.
ramhead
๋ ˆ๋ฒจ 13

์ž๋ฐ” 8 ๊ฐ€์ด๋“œ. 2 ๋ถ€.

Random-KO ๊ทธ๋ฃน์— ๊ฒŒ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

๋‚ ์งœ API

Java 8์—๋Š” java.time ํŒจํ‚ค์ง€์— ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ API๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด Date API๋Š” Joda-Time ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์œ ์‚ฌ ํ•˜์ง€๋งŒ ๋™์ผํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์ƒˆ API์˜ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค.
์‹œ๊ณ„
์‹œ๊ณ„๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ณ„๋Š” ์‹œ๊ฐ„๋Œ€๋ฅผ ์ธ์‹ํ•˜๋ฏ€๋กœ System.currentTimeMillis() ๋Œ€์‹  ์‚ฌ์šฉํ•˜์—ฌ ํ˜„์žฌ ์‹œ๊ฐ„์„ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ์‹œ๊ฐ„ ์ •๋ฐ€๋„๋Š” Instant ํด๋ž˜์Šค ๋กœ๋„ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค . Instants๋Š” ์ƒ์†๋œ java.util.Date ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . Clock clock = Clock.systemDefaultZone(); long millis = clock.millis(); Instant instant = clock.instant(); Date legacyDate = Date.from(instant); // legacy java.util.Date
์‹œ๊ฐ„๋Œ€
์‹œ๊ฐ„๋Œ€๋Š” ์ถ”์ƒ ํด๋ž˜์Šค ZoneId ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค . ์ด๋Š” ํ†ต๊ณ„์  ํŒฉํ† ๋ฆฌ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๋Œ€๋Š” ํ˜„์žฌ ๋‚ ์งœ์™€ ํ˜„์ง€ ๋‚ ์งœ ๋ฐ ์‹œ๊ฐ„ ๊ฐ„์˜ ๋ณ€ํ™˜์— ์ค‘์š”ํ•œ ์˜คํ”„์…‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. System.out.println(ZoneId.getAvailableZoneIds()); // prints all available timezone ids ZoneId zone1 = ZoneId.of("Europe/Berlin"); ZoneId zone2 = ZoneId.of("Brazil/East"); System.out.println(zone1.getRules()); System.out.println(zone2.getRules()); // ZoneRules[currentStandardOffset=+01:00] // ZoneRules[currentStandardOffset=-03:00]
ํ˜„์ง€ ์‹œ๊ฐ
LocalTime์€ ์‹œ๊ฐ„๋Œ€ ์—†์ด ์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค(์˜ˆ: 17:30:15). ๋‹ค์Œ ์˜ˆ์—์„œ๋Š” ์œ„์— ์ •์˜๋œ ์‹œ๊ฐ„๋Œ€์— ๋Œ€ํ•œ ๋‘ ๊ฐœ์˜ ํ˜„์ง€ ์‹œ๊ฐ„ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‘ ๊ฐœ์ฒด๋ฅผ ๋น„๊ตํ•˜๊ณ  ์‹œ๊ฐ„๊ณผ ๋ถ„์˜ ์ฐจ์ด๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. LocalTime now1 = LocalTime.now(zone1); LocalTime now2 = LocalTime.now(zone2); System.out.println(now1.isBefore(now2)); // false long hoursBetween = ChronoUnit.HOURS.between(now1, now2); long minutesBetween = ChronoUnit.MINUTES.between(now1, now2); System.out.println(hoursBetween); // -3 System.out.println(minutesBetween); // -239 LocalTime์—๋Š” ๋ฌธ์ž์—ด ๊ตฌ๋ฌธ ๋ถ„์„์„ ํฌํ•จํ•˜์—ฌ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹ค์–‘ํ•œ ํŒฉํ„ฐ๋ฆฌ ๋ฉ”์„œ๋“œ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. LocalTime late = LocalTime.of(23, 59, 59); System.out.println(late); // 23:59:59 DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedTime(FormatStyle.SHORT) .withLocale(Locale.GERMAN); LocalTime leetTime = LocalTime.parse("13:37", germanFormatter); System.out.println(leetTime); // 13:37
ํ˜„์ง€ ๋‚ ์งœ
LocalDate๋Š” ํŠน์ • ๋‚ ์งœ(์˜ˆ: 2014-03-11)๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ LocalTime๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” ์ผ, ์›” ๋˜๋Š” ์—ฐ๋„๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ๋นผ์„œ ์ƒˆ ๋‚ ์งœ๋ฅผ ๊ณ„์‚ฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ฐ์ฒด์— ๋Œ€ํ•œ ๋ชจ๋“  ์ž‘์—…์€ ์ƒˆ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์„ธ์š”. LocalDate today = LocalDate.now(); LocalDate tomorrow = today.plus(1, ChronoUnit.DAYS); LocalDate yesterday = tomorrow.minusDays(2); LocalDate independenceDay = LocalDate.of(2014, Month.JULY, 4); DayOfWeek dayOfWeek = independenceDay.getDayOfWeek(); System.out.println(dayOfWeek); // FRIDAY ๋ฌธ์ž์—ด์—์„œ LocalDate๋ฅผ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ์€ LocalTime์„ ๊ตฌ๋ฌธ ๋ถ„์„ํ•˜๋Š” ๊ฒƒ๋งŒํผ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. DateTimeFormatter germanFormatter = DateTimeFormatter .ofLocalizedDate(FormatStyle.MEDIUM) .withLocale(Locale.GERMAN); LocalDate xmas = LocalDate.parse("24.12.2014", germanFormatter); System.out.println(xmas); // 2014-12-24
ํ˜„์ง€ ๋‚ ์งœ์‹œ๊ฐ„
LocalDateTime์€ ๋‚ ์งœ/์‹œ๊ฐ„์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์— ์ œ๊ณต๋œ ๋‚ ์งœ์™€ ์‹œ๊ฐ„์„ ํ•˜๋‚˜์˜ ์‚ฌ๋ณธ์œผ๋กœ ์กฐํ•ฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. LocalDateTime ์ธ์Šคํ„ด์Šค๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ LocalTime ๋ฐ LocalDate์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•„์š”ํ•œ ์ธ์Šคํ„ด์Šค ์†์„ฑ ๊ฐ’์„ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. LocalDateTime sylvester = LocalDateTime.of(2014, Month.DECEMBER, 31, 23, 59, 59); DayOfWeek dayOfWeek = sylvester.getDayOfWeek(); System.out.println(dayOfWeek); // WEDNESDAY Month month = sylvester.getMonth(); System.out.println(month); // DECEMBER long minuteOfDay = sylvester.getLong(ChronoField.MINUTE_OF_DAY); System.out.println(minuteOfDay); // 1439 ์ถ”๊ฐ€ ์‹œ๊ฐ„๋Œ€ ์ •๋ณด์™€ ํ•จ๊ป˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์ธ์Šคํ„ดํŠธ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Instants๋Š” java.util.Date์—์„œ ์ƒ์†๋œ ์ด์ „ ์œ ํ˜•์œผ๋กœ ์‰ฝ๊ฒŒ ๋ณ€ํ™˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Instant instant = sylvester .atZone(ZoneId.systemDefault()) .toInstant(); Date legacyDate = Date.from(instant); System.out.println(legacyDate); // Wed Dec 31 23:59:59 CET 2014 ๋‚ ์งœ-์‹œ๊ฐ„ ํ˜•์‹ ์ง€์ •์€ ๋‚ ์งœ ๋˜๋Š” ์‹œ๊ฐ„ ํ˜•์‹ ์ง€์ •๊ณผ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ์ •์˜๋œ ๋‚ ์งœ ํ˜•์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ์ˆ˜๋™์œผ๋กœ ์ •์˜๋œ ํ˜•์‹์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DateTimeFormatter formatter = DateTimeFormatter .ofPattern("MMM dd, yyyy - HH:mm"); LocalDateTime parsed = LocalDateTime.parse("Nov 03, 2014 - 07:13", formatter); String string = formatter.format(parsed); System.out.println(string); // Nov 03, 2014 - 07:13 java.text.NumberFormat๊ณผ ๋‹ฌ๋ฆฌ ์ƒˆ๋กœ์šด DateTimeFormatter๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ์Šค๋ ˆ๋“œ๋กœ๋ถ€ํ„ฐ ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค. ํ˜•์‹ ์ž‘์„ฑ ๊ตฌ๋ฌธ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š” .

์ฃผ์„

Java 8์˜ ์ฃผ์„์€ ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์œ ํšจํ•œ ์ฃผ์„ ๋ฐฐ์—ด์„ ์ €์žฅํ•˜๋Š” ์ฃผ์„ ๋ž˜ํผ๋ฅผ ์ •์˜ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. @interface Hints { Hint[] value(); } @Repeatable(Hints.class) @interface Hint { String value(); } Java 8์—์„œ๋Š” @Repeatable ์ฃผ์„์„ ์„ ์–ธํ•˜์—ฌ ๋™์ผํ•œ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ต์…˜ 1: ์ปจํ…Œ์ด๋„ˆ ์ฃผ์„ ์‚ฌ์šฉ(๊ตฌ์‹)(Java 8์—์„œ๋Š” @Repeatable ์ฃผ์„์„ ์„ ์–ธํ•˜์—ฌ ๋™์ผํ•œ ์œ ํ˜•์˜ ์—ฌ๋Ÿฌ ์ฃผ์„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .) ์˜ต์…˜ 1: ์ฃผ์„ ์ปจํ…Œ์ด๋„ˆ ์‚ฌ์šฉ(๊ตฌ์‹) @Hints({@Hint("hint1"), @Hint("hint2")}) class Person {} ์˜ต์…˜ 2: ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•œ ์ฃผ์„ ์‚ฌ์šฉ( ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ) @Hint("hint1") @Hint("hint2") class Person {} ์˜ต์…˜ 2๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Java ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•”์‹œ์ ์œผ๋กœ @Hint ์ฃผ์„์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌํ”Œ๋ ‰์…˜์„ ํ†ตํ•ด ์ฃผ์„ ์ •๋ณด๋ฅผ ์ฝ๋Š” ๋ฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. Person ํด๋ž˜์Šค ์— ๋Œ€ํ•ด @Hints Hint hint = Person.class.getAnnotation(Hint.class); System.out.println(hint); // null Hints hints1 = Person.class.getAnnotation(Hints.class); System.out.println(hints1.value().length); // 2 Hint[] hints2 = Person.class.getAnnotationsByType(Hint.class); System.out.println(hints2.length); // 2 ์ฃผ์„์„ ์„ ์–ธํ•˜์ง€ ์•Š์•˜์ง€๋งŒ getAnnotation(Hints.class) ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ๋” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ•์€ @Hint ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ชจ๋“  ์ฃผ์„์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” getAnnotationsByType ์ž…๋‹ˆ๋‹ค . ๋˜ํ•œ Java 8์˜ ์ฃผ์„ ์‚ฌ์šฉ์€ ๋‘ ๊ฐ€์ง€ ๋ชฉ์ ์œผ๋กœ ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. @Target({ElementType.TYPE_PARAMETER, ElementType.TYPE_USE}) @interface MyAnnotation {}

์ด๊ฒŒ ๋‹ค์•ผ

๋‚ด Java 8 ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํŠœํ† ๋ฆฌ์–ผ์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. JDK 8์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ API ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๋ ค๋ฉด ๋‹ค์Œ ๊ธฐ์‚ฌ๋ฅผ ์ฝ์–ด๋ณด์„ธ์š”. ์ด๋Š” Arrays.parallelSort , StampedLock ๋ฐ CompletableFuture ์™€ ๊ฐ™์€ JDK 8์˜ ๋ชจ๋“  ์ƒˆ๋กœ์šด ํด๋ž˜์Šค์™€ ์ˆจ๊ฒจ์ง„ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค .
์ฝ”๋ฉ˜ํŠธ
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION