package kr.or.ddit.basic;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Scanner;
public class DaedeokHotel {
HashMap<Integer, Room> hotelMap;
Scanner scan;
// 생성자
public DaedeokHotel() {
hotelMap = new HashMap<>();
scan = new Scanner(System.in);
// 객실 초기화
for(int i=2; i<=4; i++){
String roomType = null;
switch(i){
case 2 : roomType = "싱글룸"; break;
case 3 : roomType = "더블룸"; break;
case 4 : roomType = "스위트룸"; break;
}
for(int j=1; j<=9; j++){
int roomNum = i * 100 + j; // 객실 번호 만들기
Room r = new Room(roomNum, roomType); // Room객체 생성
hotelMap.put(roomNum, r); // Map에 저장하기
}
}
}
// 시작 메서드
public void hotelStart(){
System.out.println();
System.out.println("*********************************************");
System.out.println(" 호텔문을 열었습니다. 어서오십시요.");
System.out.println("*********************************************");
System.out.println();
while(true){
int choice = displayMenu();
switch(choice){
case 1 : // check in
checkIn(); break;
case 2 : // check out
checkOut(); break;
case 3 : // 객실 상태
showRoom(); break;
case 4 : // 업무 종료.
System.out.println();
System.out.println("*********************************************");
System.out.println(" 호텔문을 닫았습니다.");
System.out.println("*********************************************");
return;
default :
System.out.println("작업 번호를 잘못 입력했습니다.");
System.out.println("다시 입력하세요.");
}
}
}
// 체크 아웃 메서드
private void checkOut(){
System.out.println();
System.out.println("----------------------------------------------");
System.out.println(" 체크아웃 작업");
System.out.println("----------------------------------------------");
System.out.println("체크아웃 할 방 번호를 입력하세요.");
System.out.print("방번호 입력 >> ");
int num = scan.nextInt();
// 입력한 값이 Map의 키값에 없으면 잘못 입력한 방번호이다.
if(!hotelMap.containsKey(num)){
System.out.println(num + "호 객실은 존재하지 않습니다.");
return;
}
// 입력받은 객실에 현재 투숙한 사람의 이름을 구해온다.
String name = hotelMap.get(num).getGuestName();
// 해당 객실에 투숙객이 없는지 검사
//if(hotelMap.get(num).getGuestName()==null){
if(name==null){
System.out.println(num + "호 객실에는 체크인 한 사람이 없습니다.");
return;
}
// 투숙객 이름을 null로 변경해서 체크아웃을 진행한다.
hotelMap.get(num).setGuestName(null);
System.out.println(num + "호 객실의 " + name
+ "님 체크아웃을 완료했습니다.");
}
// 객실 상태 출력하는 메서드
private void showRoom(){
System.out.println();
// 방번호를 순서대로 나오게 하기 위해서 방번호(Map의 key값)만
// List에 넣은 후 정렬하여 사용한다.
ArrayList<Integer> roomNumList
= new ArrayList<>(hotelMap.keySet());
Collections.sort(roomNumList); // 방번호를 오름차순으로 정렬
System.out.println("----------------------------------------------");
System.out.println(" 현재 객실 상태");
System.out.println("----------------------------------------------");
System.out.println(" 방 번호 방 종류 투숙객 이름");
System.out.println("----------------------------------------------");
// List에서 방번호를 하나씩 꺼내와 Map에서 해당 방번호에 대한
// Room객체를 구해서 출력한다.
for(int i=0; i<roomNumList.size(); i++){
Room r = hotelMap.get(roomNumList.get(i));
String name = " -";
if(r.getGuestName()!=null){
name = r.getGuestName();
}
System.out.println(r.getRoomNumber() + "\t"
+ r.getRoomType() + "\t"
+ name);
}
System.out.println("----------------------------------------------");
System.out.println();
}
// 체크인 메서드
private void checkIn(){
System.out.println();
System.out.println("----------------------------------------------");
System.out.println(" 체크인 작업");
System.out.println("----------------------------------------------");
System.out.println(" * 201~209 : 싱글룸");
System.out.println(" * 301~309 : 더블룸");
System.out.println(" * 401~409 : 스위트룸");
System.out.println("----------------------------------------------");
System.out.print(" 방 번호 입력 >> ");
int num = scan.nextInt();
// 입력한 값이 Map의 키값에 없으면 잘못 입력한 방번호이다.
if(!hotelMap.containsKey(num)){
System.out.println(num + "호 객실은 존재하지 않습니다.");
return;
}
// 해당 객실에 다른 투숙객이 이미 있는지 검사
if(hotelMap.get(num).getGuestName() != null){
System.out.println(num + "호 객실에는 이미 다른 손님이 있습니다.");
return;
}
System.out.println("누구를 체크인 하시겠습니까?");
System.out.print("이름 입력 >> ");
String name = scan.next();
// 입력받은 투숙객 이름을 해당 객실의 투숙객 명단에 저장한다.
hotelMap.get(num).setGuestName(name);
System.out.println(name + "씨가 " + num + "호 객실에 체크인 되었습니다.");
}
// 메뉴 출력 및 작업 번호를 입력받아 반환하는 메서드
private int displayMenu(){
System.out.println();
System.out.println("-----------------------------------------------------------");
System.out.println("어떤 업무를 하시겠습니까?");
System.out.println("1. 체크인 2. 체크아웃 3. 객실상태 4. 업무종료");
System.out.println("-----------------------------------------------------------");
System.out.print(" 선택>> ");
int num = scan.nextInt();
return num;
}
public static void main(String[] args) {
new DaedeokHotel().hotelStart();
}
}
class Room{
private int roomNumber; // 방 번호
private String roomType; // 방 종류
private String guestName; // 투숙객 이름
public Room(int roomNumber, String roomType) {
super();
this.roomNumber = roomNumber;
this.roomType = roomType;
}
public int getRoomNumber() {
return roomNumber;
}
public void setRoomNumber(int roomNumber) {
this.roomNumber = roomNumber;
}
public String getRoomType() {
return roomType;
}
public void setRoomType(String roomType) {
this.roomType = roomType;
}
public String getGuestName() {
return guestName;
}
public void setGuestName(String guestName) {
this.guestName = guestName;
}
}