이번엔 만들어 놓은 달력에 일정을 등록하고 등록한 일정을 검색하는 추가 기능을 구현해보겠습니다.
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
<<2020년 7월>>
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를 입력하고 해당 날짜를 입력하면 저장된 일정이 출력되는 기능을 구현 하였습니다.