java공부 - 스케줄러만들기 (수정본)
2022. 5. 3. 23:44ㆍJAVA
728x90
2022.03.18 - [JAVA] - java- 간단한 스케줄러 만들어보기
약 2달전에 만들었던 스케줄러이다.
이 코드에서 개선해야 할 점
1. MonthSchedule과 Day의 관계 맺기가 미숙했다.
2. MonthSchedule과 Day 클라스의 필드와 메소드를의 짜임새가 미숙하다.
3. MonthSchedule의 객체를 일일이 생성한 것
4. MonthSchedule의 Day[] day가 크기가 정해져있는 배열로 생성한 것
등등....
다음은 개선한 코드이다.
package scheduler;
import java.util.ArrayList;
import java.util.Locale;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.format.TextStyle;
public class Month {
ArrayList<Day> day = new ArrayList<Day>();
final static int yearNum = 2022;
int monthNum;
int dayNum_Month;
Month(int monthNum ,int dayNum_Month){
if(monthNum<0 || monthNum>12) {
System.out.println("1월부터 12월까지 있습니다.");
return;
}
this.monthNum = monthNum;
this.dayNum_Month = dayNum_Month;
}
void setDay(ArrayList<Day> day) {
for(int i=1;i<dayNum_Month+1;i++) {
day.add(new Day(yearNum,monthNum,i));// 1일은 day[0]이다.
}
}
}
class Day {
int yearNum;
int monthNum;
int dayNum;
// 1일,2일,3일,4일,5일,...
String work;
Day(int yearNum, int monthNum,int dayNum){
this.yearNum = yearNum;
this.monthNum = monthNum;
this.dayNum = dayNum;
}
void getDayName(int yearNum ,int monthNum,int dayNum) {
LocalDate date = LocalDate.of(yearNum, monthNum, dayNum);
DayOfWeek dayOfWeek = date.getDayOfWeek();
System.out.print(dayOfWeek.getDisplayName(TextStyle.FULL, Locale.KOREAN));
}
void setWork(String work) {
this.work = work;
}
String getWork() {
return work;
}
}
Month class와 Day class는 포함관계이다. 따라서 Month 클라스의 필드에 Day 클라스를 위치시켰고, Day 클라스의 필드 dayNum은 Month에 따라서 변하므로 ArrayList를 사용했다.(1,2,4의 개선점)
LocalDate 라이브러리를 사용해서 요일을 표현하였다. (+ 추가)
package scheduler;
import java.util.Scanner;
import org.w3c.dom.ranges.RangeException;
public class Scheduler extends Month{
static Scheduler[] scheduler = new Scheduler[13];
Scheduler(int monthNum, int dayNum_Month) {
super(monthNum, dayNum_Month);
setDay(day);
}
public static void initializeScheduler() {
for(int i=1;i<13;i++) {
if(i == 2) {
scheduler[i] = new Scheduler(i,28);
}else {
if(i%2 == 0) {
scheduler[i] = new Scheduler(i,30);
}else {
scheduler[i] = new Scheduler(i,31);
}
}
}
}
public static void input(int monthNum, int dayNum, String schedule) {
// 해당 달/일에 일정을 입력(수정)한다.
scheduler[monthNum].day.get(dayNum-1).setWork(schedule);
}
public static void view_month(int monthNum) {
// 해당 달에 해당하는 날의 일정만 본다.
System.out.println(scheduler[monthNum].day.get(1).monthNum);
for(int i =1;i<scheduler[monthNum].dayNum_Month+1;i++) {
System.out.print(scheduler[monthNum].day.get(i-1).dayNum + " ");
scheduler[monthNum].day.get(i-1).getDayName(yearNum,monthNum,i);
System.out.print(" : ");
System.out.println(scheduler[monthNum].day.get(i-1).getWork());
System.out.println();
}
}
public static void view_month_day(int monthNum, int dayNum) {
System.out.print(scheduler[monthNum].day.get(dayNum-1).dayNum + " ");
scheduler[monthNum].day.get(dayNum-1).getDayName(yearNum,monthNum,dayNum);
System.out.print(" : ");
System.out.println(scheduler[monthNum].day.get(dayNum-1).getWork());
}
public static void finishScheduler() {
System.out.println("프로그램을 이용해주셔서 감사합니다.");
System.exit(0);
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.println("스케줄러 프로그램을 실행합니다.");
initializeScheduler();
while(true){
System.out.println("몇 월달의 스케줄을 확인할까요?");
int month;
do {
System.out.println("1월~12월");
month = scan.nextInt();
}while(month>12 || month<1);
view_month(month);
System.out.println("몇 일의 스케줄을 확인할까요?");
int day = scan.nextInt();
System.out.println("입력(수정) - 1번, 일정보기 - 2번, 종료하기 - 3번");
int choice = scan.nextInt();
scan.nextLine();
switch(choice) {
case 1:
System.out.println("일정을 입력해주세요");
String work = scan.nextLine();
input(month, day, work);
break;
case 2:
view_month_day(month,day);
break;
case 3:
finishScheduler();
break;
}
}
}
}
Schedule 클라스와 Month 클라스를 상속이라는 관계로 연관시켰다.
Scheduler를 객체배열을 이용하여 각 달마다 Scheduler 객체를 갖게끔 만들었다.(3의 개선점)
코드들을 다듬으면서 객체지향프로그래밍에대해서 조금 더 알아갈 수 있었던 것 같다.
감사합니다~!
++ 코드를 작성한 후
Schedule 클라스와 Month 클라스의 관계를 상속관계로 설정하는 것보다 Schedule 클라스의 필드로 Month 클라스로 설정하는 것이 더 나은 코드 코드인것 같다.
728x90
'JAVA' 카테고리의 다른 글
Optional<T>에 관하여 (0) | 2022.09.01 |
---|---|
JDBC - Class.forName() (0) | 2022.07.17 |
java - 행맨 게임 만들기(명품 자바 프로그래밍 8장-Open Challenge) (0) | 2022.04.29 |
영어 단어 테스트 프로그램 만들기 (0) | 2022.04.03 |
java 공부 - 명품 자바 프로그래밍 7장 11번(변형) (0) | 2022.04.02 |