일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- Android
- androidstudio
- bitmap
- BOJ
- Canvas
- CS
- Database
- DBeaver
- DP
- Ecilpse
- Eclipse
- firebase
- git
- github
- GooglePlayServices
- gradle
- IDE
- IntelliJ
- java
- json
- kotlin
- level2
- linux
- mariadb
- MYSQL
- Paint
- permission
- python
- Sorting
- sourcetree
will come true
[프로그래머스 / Level1] 2016년 (Java) 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/12901?language=java
핵심 키워드
- 날짜 관련 클래스
- Date 클래스
- Calendar 클래스
- java.time 패키지
- LocalDate 클래스
기존 코드 (성공) - LocalDate 코드
import java.time.LocalDate;
class Solution {
public String solution(int a, int b) {
String answer = "";
LocalDate date = LocalDate.of(2016, a, b);
answer = date.getDayOfWeek().toString().substring(0, 3);
return answer;
}
}
- LocalDate 내장함수를 사용하여 2016년 a월 b일의 요일을 구했다.
- getDayOfWeek() 인스턴스 메서드는 반환값이 DayOfWeek이기 때문에 .toString()후 문자열을 잘라줘야 한다.
메서드 | 설명 |
static LocalDate of(int year, int month, int day) | 지정한 연, 월, 일로 LocalDate 객체 생성 |
DayOfWeek getDayOfWeek() | 요일(TUESDAY) 반환. getDayOfWeek().getValue() = 2 |
int get(TemporalField field) | 지정한 필드에 해당하는 상수 값 반환 |
*TemporalField는 년, 월, 일 등 날짜와 시간의 필드를 정의해 놓은 것으로, 열거형 ChronoField가 이 인터페이스를 구현한다. 열거형 ChronoField는 관련된 날짜 상수들(DAY_OF_WEEK, DAY_OF_MONTH 등..)을 하나로 묶은 것이다.
아래는 Java에서 제공하는 다른 날짜 클래스 및 메서드를 사용하여 구현한 코드이다.
Calendar 코드
import java.util.Calendar;
class Solution {
public String solution(int a, int b) {
String answer = "";
final String[] DAY_OF_WEEK = { "", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"} ; //요일 배열
Calendar cal = Calendar.getInstance();
cal.set(2016, a-1, b); //Calendar는 월이 0부터 시작(0:1월)
answer = DAY_OF_WEEK[cal.get(Calendar.DAY_OF_WEEK)]; //Calendar는 요일이 1부터 시작(1:일요일), 숫자로 반환
return answer;
}
}
- Calendar는 요일을 무조건 숫자로 반환해주기 때문에 해당 숫자를 index로 접근해서 요일 문자열을 얻어올 배열을 선언해둔다. Calendar는 요일이 1부터 시작하기 때문에(1~7, 1:일요일) 0의 자리는 비워둔다.
- Calendar에서 월은 0부터 시작하기 때문에(0~11, 0:1월) a에서 1뺀 값을 월로 지정해줘야 한다. (ex: a가 6월일 경우 a값을 그대로 넘기면 Calendar객체는 7월로 설정된다.
메서드 | 설명 |
static Calendar getInstance() | Calendar 객체를 생성해서 반환 |
void set(int year, int month, int day) | Calendar 객체를 원하는 날짜로 설정 (default : 현재 날짜) |
int get(int field) | Calender 객체에서 field에 해당하는 값을 반환 |
Calendar.DAY_OF_WEEK | Calendar 클래스에 선언된 final 상수 (DAY_OF_WEEK = 7) |
※ Calendar와 LocalDate에서 월(MONTH), 요일(DAY_OF_WEEK)의 차이
- Calendar : 월(0~11, 0:1월), 요일(1~7, 1:일요일)
- LocalDate : 월(1~12, 1:1월), 요일(1~7, 1:월요일)
날짜 관련 클래스가 여러개인 이유
초기에는 날짜와 시간을 다룰 목적으로 Date 클래스만을 제공했으며(JDK1.0), 이후 Date의 부족한 기능을 보완해서 Calendar 클래스를 추가 제공하였다(JDK1.1). 날짜 관련으로는 이 두 클래스만을 오랜 시간 사용하다가 한참이 지나서 Date와 Calendar의 단점을 보완한 java.time패키지를 내놓은 것(JDK1.8). 제공 버전의 차이가 큰 만큼 Date, Calendar는 너무 오랜 시간 사용되었기 때문에 아직까지 없애지 못하고 남아있는 것. 되도록 최신 기능인 java.time패키지의 기능을 사용하는 것을 추천한다.
- Date 클래스 - JDK1.0 부터 제공 (현재 대부분 메서드가 deprecated됨)
- Calendar 클래스 - JDK1.1 부터 제공
- java.time패키지 - JDK1.8 부터 제공
(LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Period 등 클래스와 날짜 관련 열거형, 패키지 들을 포함)
*패키지는 여러 클래스들을 하나로 묶은 것. (=디렉터리)
*deprecated : 중요도가 떨어져 더 이상 사용되지 않고 앞으로는 사라지게 될 (컴퓨터 시스템 기능 등)
'Algorithm' 카테고리의 다른 글
[프로그래머스 / Level1] 비밀지도 (Java) (0) | 2021.11.01 |
---|---|
[프로그래머스 / Level1] 부족한 금액 계산하기 (Java) (0) | 2021.11.01 |
[프로그래머스 / Level1] 다트 게임 (Java) (0) | 2021.10.31 |
[프로그래머스 / Level1] 3진법 뒤집기 (Java) (0) | 2021.10.30 |
[프로그래머스 / Level1] 문자열 다루기 (Java) (0) | 2021.10.30 |