본문 바로가기
JAVA

java공부 - 스케줄러만들기 (수정본)

by Big Sun 2022. 5. 3.
728x90

2022.03.18 - [JAVA] - java- 간단한 스케줄러 만들어보기

 

java- 간단한 스케줄러 만들어보기

public class Day { private String work; public void setWork(String work) { this.work = work; } public String getWork() { return work; } public void show() { if(work == null) { System.out.println("오..

rasony.tistory.com

 

약 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