[Java] 캘린더 만들기 - 일정 등록 / 검색 기능 구현하기

나영원·2020년 8월 24일
0

Java_basic

목록 보기
20/60

이번엔 만들어 놓은 달력에 일정을 등록하고 등록한 일정을 검색하는 추가 기능을 구현해보겠습니다.

	public void printMenu() {
		
		System.out.println("+----------------------+");
		System.out.println("| 1. 일정 등록 ");          
		System.out.println("| 2. 일정 검색");           
		System.out.println("| 3. 달력 보기");
		System.out.println("| h. 도움말 q. 종료");
		System.out.println("+----------------------+");
	}

메뉴 목록을 만들기 위해 Prompt 클래스에 printMenu 메소드를 추가합니다.

public void runPrompt() {
		
		printMenu();
		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();
		
		
		
		for (;;) {
								
			String cmd = scanner.next();
			if (cmd.equals("1")) cmdRegister();
			else if(cmd.equals("2")) cmdSearch();
			else if(cmd.equals("3")) cmdCal(scanner, cal);
			else if(cmd.equals("h")) printMenu();
			else if(cmd.equals("q")) break;
			
		}

		System.out.println("Thanks, Bye~");
		scanner.close();
		
	}

메뉴 항목에 맞추어 입력값을 입력 받기 위해 runPrompt() 안에 for문과 if-else-if문을 사용해 각 입력 별 어떤 메소드가 사용되야 하는지 지정해 줍니다. (1-cmdRegister(), 2- cmdSearch()....)

private void cmdCal(Scanner s, Calendar c) {
		
		int month = 1;
		int year = 2020;
		
		System.out.println("연도를 입력하세요.(exit: -1)");
		System.out.print("YEAR> ");
		year = s.nextInt();
			
		System.out.println("월을 입력하세요:");
		System.out.print("MONTH> ");
		month = s.nextInt();
		
		if (month >12 || month <1) {
			System.out.println("잘못된 입력 입니다.");
			
		} else{ c.printCalendar(year, month);;
			
			System.out.println("");
		}
			
			return;
		}

runPrompt 메소드 안에 있던 달력의 연과 월을 입력 받던 입력문들을 cmdCal메소드로 이동해 줍니다.

cmdCal(Scanner s, Calendar c) 은 이미 본문에서 선언된 Scanner와 Calendar 클래스를 중복으로 선언하는 것을 피하기 위해 입력값으로 참조하여 놓은 모습입니다.

중간 결과 값
+----------------------+
| 1. 일정 등록 
| 2. 일정 검색
| 3. 달력 보기
| h. 도움말 q. 종료
+----------------------+
h
+----------------------+
| 1. 일정 등록 
| 2. 일정 검색
| 3. 달력 보기
| h. 도움말 q. 종료
+----------------------+
3
연도를 입력하세요.(exit: -1)
YEAR> 2020
월을 입력하세요:
MONTH> 7
   <<20207>>
 SU MO TU WE TU FR SA
----------------------
           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 31

q
Thanks, Bye~

h를 입력하면 메뉴가 호출되고 3을 입력하면 달력을 볼 수 있으며 q를 입력하면 실행이 종료되는 것을 확인 할 수 있습니다.

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public void registerPlan(String strDate, String plan) throws ParseException {
		
		Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
		System.out.println(date);
		
	}

일정을 등록하기 위해 먼저 String 입력값 strDate를 date로 바꿔주기 위한 registerPlan 메소드를 작성합니다.

SimpleDateFormat 클래스를 통해 yyyy-MM-dd 형식의 String 입력값을 date형식으로 바꾸어 줍니다.

public static void main(String[] args) throws ParseException {
		
		Calendar cal = new Calendar();
		
	cal.registerPlan("2020-07-08", "Let's hava dinner!");
		
		
	}

    //결과값
    Wed Jul 08 00:00:00 KST 2020

registerPaln이 잘 출력 되는지 확인하기 위해 간단한 출력문을 사용해서 확인해보니 date형식의 결과값이 나오는 것을 확인할 수 있었습니다.


	private HashMap<Date, String> planMap;
	
	public Calendar() {
		planMap = new HashMap<Date, String>();
	
	}

다음으로 날짜별 계획을 저장하기 위해 (key,data)형식의 배열로 저장해주는 HashMap 클래스를 사용해 planMap이라는 메소드를 만들어 줍니다.

public void registerPlan(String strDate, String plan) throws ParseException {
		
		Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
		//System.out.println(date);
		planMap.put(date, plan);
		
	}

입력된 날짜와 일정을 저장하는 넣기 위해 registerPlan 메소드에 planMap.put(date, plan); 문장을 넣어줍니다.

이것을 통해 사용자가 strDate와 plan을 입력하면 planMap 메소드를 통해 저장이 됩니다.

	public String serchPlan(String strDate) throws ParseException {
		
		Date date = new SimpleDateFormat("yyyy-MM-dd").parse(strDate);
		String plan = planMap.get(date);
		return plan;
	}

다음으로 저장된 plan을 불러오기 위해 serchPlan메소드를 작성합니다.

Date형식으로 저장되어 있기 때문에 사용자가 strDate를 입력하면 Date형식으로 바꾸어서 planMap.get(date)안에 넣음으로 저장된 plan 값을 검색해서 return 합니다.

	//simple test code
	public static void main(String[] args) throws ParseException {
		
		Calendar cal = new Calendar();
		
	cal.registerPlan("2020-07-08", "Let's hava dinner!");
	System.out.println(cal.serchPlan("2020-07-08"));
		
	}
    
    //결과값
	Let's hava dinner!

중간 결과를 확인해보기 위해 registerPlan을 통해 (strDate,plan)을 입력하여 저장하고 serchPaln을 통해 (strDate)를 입력하여 검색한 결과 plan 값이 출력됩니다.

일정 등록 / 검색 메소드를 완성하였으니 입력 부인 Prompt 클래스로 돌아가서 앞에서 미리 만들어 놓은 cmdRegister/cmdSearch 메소드를 채워 넣겠습니다.

private void cmdRegister(Scanner s, Calendar c) throws ParseException {
		System.out.println("[새 일정 등록]");
		System.out.println("날짜를 입력해주세요 (yyyy-MM-dd)");
		String date = s.next();
		String text = "";
		s.nextLine(); // ignore one new line
		System.out.println("일정을 입력해주세요 (yyyy-MM-dd)");
		text = s.nextLine();
		
		c.registerPlan(date, text);
		
	}

cmdRegister 메소드에 Stirng date와 Stirng text 입력값을 받아서 c.regiserPlan 메소드를 이용해 저장하게 합니다.

중간에 s.nextLine();문장을 작성 하지 않을 경우 나중에 저장한 일정을 불러 와도 빈칸인 경우가 생기니 꼭 작성해야 합니다.

private void cmdSearch(Scanner s, Calendar c) throws ParseException {
		System.out.println("[일정 검색]");
		System.out.println("날짜를 입력해주세요 (yyyy-MM-dd)");
		String date = s.next();
		String plan = c.serchPlan(date);
		
		System.out.println(plan);
	}

cmdSearch 메소드에선 date를 입력하면 c.serchPaln 메소드를 통해 해당 date값 옆에 저장 되어있는 plan을 불러와서 출력해주도록 작성 했습니다.

public void runPrompt() throws ParseException {
		
		printMenu();
		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();
				
		for (;;) {
								
			String cmd = scanner.next();
			if (cmd.equals("1")) cmdRegister(scanner, cal);
			else if(cmd.equals("2")) cmdSearch(scanner, cal);
			else if(cmd.equals("3")) cmdCal(scanner, cal);
			else if(cmd.equals("h")) printMenu();
			else if(cmd.equals("q")) break;
		}

		System.out.println("Thanks, Bye~");
		scanner.close();
	}

마지막으로 cmdRegister와 cmdSearch에 참조 값으로 scanner,cal을 입력해줍니다.

public void runPrompt() throws ParseException {
		
		printMenu();
		Scanner scanner = new Scanner(System.in);
		Calendar cal = new Calendar();
		
		boolean isLoop = true;
		while (isLoop) {
								
			String cmd = scanner.next();
			
			switch(cmd) {
			case "1" :
				cmdRegister(scanner, cal);
				break;
			case "2" : 
				cmdSearch(scanner, cal);
				break;
			case "3" :
				cmdCal(scanner, cal);
				break;
			case "h" :
				printMenu();
				break;
			case "q" :
				isLoop = false;
				break;
			default :
				printMenu();
				break;
			}
			}
		System.out.println("Thanks, Bye~");
		scanner.close();
			}

runPrompt()메소드를 if -else if 문으로 작성하는 것보다 switch-case문이 더 가독성이 좋을 것 같아서 수정해보았습니다.

유의할 점은 case "q"의 경우 수행문에 break;만 입력할시 switch-case문만 빠져나감으로 인해 반복문을 계속 반복을 하게 됩니다.

q를 입력시 반복문을 빠져나와 실행이 멈추게 하려면 반복문 앞에 boolean isLoop = true; 변수를 선언하여 while(isLoop)를 하여 평소에는 무한 반복을 하게하고 case"q"의 수행문에 isLoop = false를 대입하면 q를 통해 switch-case를 빠져나온 후에 while문에 false가 대입되기 떄문에 반복문 또한 빠져나와 실행도 정지가 됩니다.

최종 결과값
+----------------------+
| 1. 일정 등록 
| 2. 일정 검색
| 3. 달력 보기
| h. 도움말 q. 종료
+----------------------+
1
[새 일정 등록]
날짜를 입력해주세요 (yyyy-MM-dd)
2020-07-08
일정을 입력해주세요 (yyyy-MM-dd)
공부마치고 집에가기
2
[일정 검색]
날짜를 입력해주세요 (yyyy-MM-dd)
2020-07-08
공부마치고 집에가기

다음과 같이 1을 입력하여 날짜와 일정을 입력하고 2를 입력하고 해당 날짜를 입력하면 저장된 일정이 출력되는 기능을 구현 하였습니다.

profile
배우는 개발 일기

0개의 댓글