트랙
/
Java
Java
/
연습 문제
/
미용실 예약하기
미용실 예약하기

미용실 예약하기

학습 연습 문제

소개

날짜와 시간

Java 8에서 도입된 java.time 패키지에는 날짜와 시간을 다루는 여러 클래스가 있어요.

LocalDate

java.time.LocalDate 클래스는 ISO-8601 달력 체계에서 시간대가 없는 날짜를 나타내요. 예를 들어 2007-12-03 같은 값이에요:

LocalDate date = LocalDate.of(2007, 12, 3);

날짜는 다른 날짜와 비교할 수 있어요:

LocalDate date1 = LocalDate.of(2007, 12, 3);
LocalDate date2 = LocalDate.of(2007, 12, 4);

date1.isBefore(date2);
// => true

date1.isAfter(date2);
// => false

LocalDate 인스턴스에는 날짜의 각 부분을 가져오는 게터가 있어요:

LocalDate date = LocalDate.of(2007, 12, 3);

date.getDayOfMonth();
// => 3

LocalDate 인스턴스에는 시간 단위를 더하는 메서드가 있어요:

Note

이 메서드들은 새로운 LocalDate 인스턴스를 반환하며, LocalDate 클래스는 불변이기 때문에 기존 인스턴스를 변경하지 않아요.

LocalDate date = LocalDate.of(2007, 12, 3);

date.plusDays(3);
// => 2007-12-06

LocalDateTime

java.time.LocalDateTime 클래스는 ISO-8601 달력 체계에서 시간대가 없는 날짜와 시간을 나타내요. 예를 들어 2007-12-03T10:15:30 같은 값이에요:

LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);

LocalDate 인스턴스를 LocalDateTime으로 변환할 수 있어요:

LocalDate date = LocalDate.of(2007, 12, 3);
LocalDateTime datetime = date.atTime(10, 15, 30);
datetime.toString();
// => "2007-12-03T10:15:30"

날짜와 시간 서식 지정

LocalDate와 LocalDateTime은 모두 String으로 변환하거나 String에서 변환할 때 ISO-8601 표준 표기법을 사용해요.

LocalDateTime datetime = LocalDateTime.of(2007, 12, 3, 10, 15, 30);
LocalDateTime parsed = LocalDateTime.parse("2007-12-03T10:15:30");

datetime.isEqual(parsed);
// => true

이와 다른 형식으로 String에서 LocalDate나 LocalDateTime을 파싱하는 것은 불가능해요. 대신 사용자 지정 형식으로 날짜를 서식 지정하려면 java.time.format.DateTimeFormatter를 사용해야 해요:

DateTimeFormatter parser = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate date = LocalDate.parse("03/12/2007", parser);

DateTimeFormatter printer = DateTimeFormatter.ofPattern("MMMM d, yyyy");
printer.format(date);
// => "December 3, 2007"

사용자 지정 형식을 만들 때 로케일을 지정해서 지역마다 다른 방식으로 서식을 지정하고 파싱할 수도 있어요:

DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.FRENCH).format(date);
// => décembre 3, 2007

DateTimeFormatter.ofPattern("MMMM d, yyyy", Locale.of("pt")).format(date);
// => dezembro 3, 2007

지침

이 연습 문제에서는 2012년 9월 15일에 문을 연 뉴욕의 한 미용실을 위한 예약 스케줄러를 만들어 봐요.

1. 예약 날짜 파싱하기

예약 날짜를 나타내는 텍스트를 그에 해당하는 LocalDateTime으로 파싱하도록 AppointmentScheduler.schedule() 메서드를 구현해요.

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.schedule("7/25/2019 13:45:00");
// => LocalDateTime.of(2019, 7, 25, 13, 45, 0)

2. 예약이 이미 지났는지 확인하기

예약 날짜를 받아서 그 예약이 과거에 있었는지 확인하는 AppointmentScheduler.hasPassed() 메서드를 구현해요.

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.hasPassed(LocalDateTime.of(1999, 12, 31, 9, 0, 0));
// => true

3. 예약이 오후인지 확인하기

예약 날짜를 받아서 그 예약이 오후(12:00 이상, 18:00 미만)인지 확인하는 AppointmentScheduler.isAfternoonAppointment() 메서드를 구현해요.

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.isAfternoonAppointment(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => true

4. 예약의 시간과 날짜 설명하기

예약 날짜를 받아서 그 날짜와 시간에 대한 설명을 반환하는 AppointmentScheduler.getDescription() 메서드를 구현해요.

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getDescription(LocalDateTime.of(2019, 03, 29, 15, 0, 0))
// => "You have an appointment on Friday, March 29, 2019, at 3:00 PM."

5. 기념일 날짜 반환하기

9월 15일인 올해의 기념일 날짜를 반환하는 AppointmentScheduler.getAnniversaryDate() 메서드를 구현해요.

AppointmentScheduler scheduler = new AppointmentScheduler();
scheduler.getAnniversaryDate()
// => LocalDate.of(<current year>, 9, 15)
GitHub에서 편집 링크가 새 창이나 탭에서 열려요
Java Exercism

미용실 예약하기 문제를 시작해 볼 준비가 됐나요?

Exercism에 가입하고 Java 트랙을 개념 26개연습 문제 158개, 그리고 실제 사람의 멘토링과 함께 배우고 익혀 보세요. 모두 무료예요.