Java

[고급자바] 문제(전화번호, 호텔 관리 프로그램)

elog 2023. 3. 4. 00:00

문제 1) 전화번호 관리 프로그램

이름, 주소, 전화번호를 멤버로 갖는 Phone클래스를 만들고 Map을 이용하여 전화번호 정보를 관리하는 프로그램을 작성하시오.
- Map의 구조 : key값은 입력한 '이름'으로 사용하고 value값은 'Phone클래스의 인스턴스'로 한다.

예) HashMap<String, Phone> 변수명;
  

더보기


   - 아래의 메뉴를 구현한다.
   1. 전화번호 등록
   2. 전화번호 수정
    3. 전화번호 삭제
    4. 전화번호 검색
    5. 전화번호 전체 출력 
    0. 프로그램 종료
    -----------------------------
   
    - 삭제, 검색 기능은 '이름'을 입력 받아 처리한다.
   
    실행예시)
    -----------------------------
  다음 메뉴를 선택하세요.
   1. 전화번호 등록
   2. 전화번호 수정
    3. 전화번호 삭제
    4. 전화번호 검색
    5. 전화번호 전체 출력 
    0. 프로그램 종료
    -----------------------------
    번호입력 >> 1
   
    새롭게 등록할 전화번호 정보를 입력하세요.
    이 름 >> 홍길동
    전화번호 >> 010-1111-1111
    주 소 >> 대전시 중구 오류동
   
    '홍길동'씨의 전화번호 정보가 등록되었습니다.
    -----------------------------
  다음 메뉴를 선택하세요.
   1. 전화번호 등록
   2. 전화번호 수정
    3. 전화번호 삭제
    4. 전화번호 검색
    5. 전화번호 전체 출력 
    0. 프로그램 종료
    -----------------------------
    번호입력 >> 1
   
    새롭게 등록할 전화번호 정보를 입력하세요.
    이 름 >> 홍길동
   
    '홍길동'은 이미 등록된 사람입니다.
   
    -----------------------------
  다음 메뉴를 선택하세요.
   1. 전화번호 등록
   2. 전화번호 수정
    3. 전화번호 삭제
    4. 전화번호 검색
    5. 전화번호 전체 출력 
    0. 프로그램 종료
    -----------------------------
    번호입력 >> 5
   
    ----------------------------------
    번호    이 름    전화번호       주 소
       1     홍길동     010-1111-1111 대전시 중구 오류동 
    ----------------------------------
    출력 완료...
   
    -----------------------------
  다음 메뉴를 선택하세요.
   1. 전화번호 등록
   2. 전화번호 수정
    3. 전화번호 삭제
    4. 전화번호 검색
    5. 전화번호 전체 출력 
    0. 프로그램 종료
    -----------------------------
    번호입력 >> 0
   
    프로그램을 종료합니다.

 

A. Phone 클래스

// 이름, 주소, 전화번호를 멤버로 갖는 Phone 클래스 생성
class Phone {
	private String name;
	private String tel;
	private String addr;

	public Phone02() { }
	
	public Phone(String name, String tel, String addr) {
		super();
		this.name = name;
		this.tel = tel;
		this.addr = addr;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getTel() {
		return tel;
	}

	public void setTel(String tel) {
		this.tel = tel;
	}

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}
} // Phone 클래스

 

B. PhoneBook 클래스

public class PhoneBook {
	private HashMap<String, Phone> phoneBookMap;
	private Scanner scan;
	
	public PhoneBook() {
		phoneBookMap = new HashMap<>();
		scan = new Scanner(System.in);
	} // PhoneBook()
	
	public static void main(String[] args) {
		new PhoneBook().phoneBootStart();
	} // main
	
	public void phoneBootStart() {
		System.out.println("******************************************");
		System.out.println("      전 화 번 호 관 리 프 로 그 램 ");
		System.out.println("******************************************");
		System.out.println();
		
		while (true) {
			int choice = displayMenu();
			
			switch (choice) {
			case 1: // 등록 
				insert(); break;
			case 2: // 수정
				update(); break;
			case 3: // 삭제 
				delete(); break;
			case 4: // 검색 
				search(); break;
			case 5:	// 전체 출력
				displayAll();
				break;
			case 0:	// 종료
				System.out.println("프로그램을 종료합니다.");
				break;
			default:
				System.out.println("번호를 잘 못 입력했습니다. 다시 선택하세요.");
				break;
			}
			
		}
	} // phoneBootStart()
	
	// 전화번호 정보를 검색하는 메서드
	private void search() {
		System.out.println();
		System.out.println("검색할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		if (!phoneBookMap.containsKey(name)) {
			System.out.println(name + "씨의 전화번호 정보가 없습니다.");
			return;
		}
		
		Phone02 p = phoneBookMap.get(name);
		System.out.println(name + "씨의 전화번호 정보");
		System.out.println("-------------------------------------");
		System.out.println("이 름 : " + p.getName());
		System.out.println("전 화 : " + p.getTel());
		System.out.println("주 소 : " + p.getAddr());
		System.out.println("-------------------------------------");
		System.out.println();
	} // search()

	// 전화번호 정보를 삭제하는 메서드
	private void delete() {
		System.out.println();
		System.err.println("삭제할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		// 삭제할 대상이 있는지 검산
		if (!phoneBookMap.containsKey(name)) {
			System.out.println(name + "시는 전화번호 정보가 등록되지 않은 사람입니다.");
			return;
		}
		
		phoneBookMap.remove(name);
		System.out.println(name + "씨의 전화번호 정보가 삭제되었습니다.");
		
	} //delete()

	// 전화번호 정보를 수정하는 메서도
	private void update() {
		System.out.println();
		System.out.println("수정할 전화번호 정보를 입력하세요.");
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		// 수정할 대상이 등록되어 있지 않으면 수정 작업을 못한다.
		if (!phoneBookMap.containsKey(name)) {
			System.out.println(name + "시는 전화번호 정보가 등록되지 않은 사람입니다.");
			return;
		} 
		
		System.out.print("새로운 전화번호 >> ");
		String newTel = scan.next();

		scan.nextLine();
		System.out.print("새로운 주소 >> ");
		String newAddr = scan.nextLine();
		
		// 같은 key값에 새로운 전화번호 정보를 저장한다. ==> 수정작업
		phoneBookMap.put(name, new Phone(name, newTel, newAddr));
		System.out.println(name + "씨의 전화번호 정보를 변경했습니다.");
		
		
	} // update()

	// 전화번호 정보 전체를 출력하는 메서드
	private void displayAll() {
		System.out.println();
		System.out.println("-------------------------------------------------");
		System.out.println("번호\t이 름\t전화번호\t주소");
		System.out.println("-------------------------------------------------");
		
		Set<String> phoneKeySet = phoneBookMap.keySet();
		if (phoneKeySet.size() == 0) {
			System.out.println("등록된 전화번호 정보가 하나도 없습니다.");
		} else {
			int num = 0;
			for (String name : phoneKeySet) { // Set 개수만큼 반복
				num++;
				Phone02 p = phoneBookMap.get(name); // value값(Phonoe 객체) 구하기
				System.out.println(num + "\t" + p.getName() + "\t" + p.getTel() + "\t" + p.getAddr());
			}
		}
		System.out.println("-------------------------------------------------");
		System.out.println("출력 끝");
	} // displayAll()

	// 전화번호 정보를 등록하는 메서드
	private void insert() {
		System.out.println();
		System.out.println("새롭게 등록할 전화번호 정보를 입력하세요.");
		
		System.out.print("이 름 >> ");
		String name = scan.next();
		
		// 이미 등록된 사람인지 여부 검사
		if (phoneBookMap.containsKey(name)) {
			System.out.println(name + "씨는 이미 등록된 사람입니다.");
			return;
		}
		
		System.out.print("전화번호 >> ");
		String tel = scan.next();
		
		scan.nextLine();	// 입력 버퍼 비우기
		System.out.print("주 소 >> ");
		String addr = scan.nextLine();
		
//		Phone p = new Phone(name, tel, addr);
//		phoneBookMap.put(name, p);
		
		phoneBookMap.put(name, new Phone(name, tel, addr));
		System.out.println(name + "씨 전화번호 정보 등록 완료!!!");
	} // insert()

	// 메뉴를 출력하고 사용자가 입력한 작업 번호를 반환하는 메서드
	private int displayMenu() {
		System.out.println("------------------------------------");
		System.out.println("다음 메뉴르 선택하세요.");
		System.out.println("1. 전화번호 등록");
		System.out.println("2. 전화번호 수정");
		System.out.println("3. 전화번호 삭제");
		System.out.println("4. 전화번호 검색");
		System.out.println("5. 전화번호 전체 출력");
		System.out.println("0. 프로그램 종료");
		System.out.println("------------------------------------");
		System.out.print("번호입력 >> ");
		return scan.nextInt();
	} // displayMenu()
	
} // PhoneBook


문제 2) 호텔 객실 관리 프로그램

조건 1) 호텔 객식을 나타내는 Room클래스는 방번호(int), 방종류, 투숙객이름 필드로 구성되어 있고 방번호와 방종류는 다음과 같다.
- 201~209 : 싱글룸

- 301~309 : 더블룸
- 401~409 : 스위트룸 

 

조건 2) 전체 객실 관리는 Map을 이용한다. (Map의 key값은 방번호로 하고 value값은 Room의 인스턴스로 한다.)
- 생성자에서는 방번호와 방종류를 초기화한다.

더보기

실행예시)

*********************************************
       호텔문을 열었습니다. 어서오십시요.
*********************************************


-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 1     <--- 입력

----------------------------------------------
   체크인 작업
----------------------------------------------
 * 201~209 : 싱글룸
 * 301~309 : 더블룸
 * 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 101     <--- 입력
101호 객실은 존재하지 않습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 1     <--- 입력

----------------------------------------------
   체크인 작업
----------------------------------------------
 * 201~209 : 싱글룸
 * 301~309 : 더블룸
 * 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 201     <--- 입력
누구를 체크인 하시겠습니까?
이름 입력 >> 홍길동
체크인이 완료되었습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 1     <--- 입력

----------------------------------------------
   체크인 작업
----------------------------------------------
 * 201~209 : 싱글룸
 * 301~309 : 더블룸
 * 401~409 : 스위트룸
----------------------------------------------
방 번호 입력 >> 201     <--- 입력
201호 객실은 이미 손님이 있습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 3     <--- 입력

----------------------------------------------
현재 객실 상태
----------------------------------------------
방 번호  방 종류  투숙객 이름
----------------------------------------------
201  싱글룸  홍길동
202  싱글룸    -
203  싱글룸    -
204  싱글룸    -
205  싱글룸    -
206  싱글룸    -
207  싱글룸    -
208  싱글룸    -
209  싱글룸    -
301  더블룸    -
302  더블룸    -
303  더블룸    -
304  더블룸    -
305  더블룸    -
306  더블룸    -
307  더블룸    -
308  더블룸    -
309  더블룸    -
401 스위트룸   -
402 스위트룸   -
403 스위트룸   -
404 스위트룸   -
405 스위트룸   -
406 스위트룸   -
407 스위트룸   -
408 스위트룸   -
409 스위트룸   -
----------------------------------------------

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 2    <--- 입력

----------------------------------------------
   체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 101    <--- 입력
101호 객실은 존재하지 않습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 2    <--- 입력

----------------------------------------------
   체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 303    <--- 입력
303호 객실에는 체크인 한 사람이 없습니다.

-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 2    <--- 입력

----------------------------------------------
   체크아웃 작업
----------------------------------------------
체크아웃 할 방 번호를 입력하세요.
방번호 입력 >> 201    <--- 입력
201호 객실의 홍길동님 체크아웃을 완료하였습니다.
-- null로 비우기
-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 3    <--- 입력


----------------------------------------------
현재 객실 상태
----------------------------------------------
방 번호  방 종류  투숙객 이름
----------------------------------------------
201  싱글룸    -
202  싱글룸    -
203  싱글룸    -
204  싱글룸    -
205  싱글룸    -
206  싱글룸    -
207  싱글룸    -
208  싱글룸    -
209  싱글룸    -
301  더블룸    -
302  더블룸    -
303  더블룸    -
304  더블룸    -
305  더블룸    -
306  더블룸    -
307  더블룸    -
308  더블룸    -
309  더블룸    -
401 스위트룸   -
402 스위트룸   -
403 스위트룸   -
404 스위트룸   -
405 스위트룸   -
406 스위트룸   -
407 스위트룸   -
408 스위트룸   -
409 스위트룸   -
----------------------------------------------


-----------------------------------------------------------
어떤 업무를 하시겠습니까?
1. 체크인    2. 체크아웃    3. 객실상태    4. 업무종료
-----------------------------------------------------------
선택>> 4    <--- 입력

*********************************************
       호텔문을 닫았습니다.
*********************************************

class Room {
	private int num;		// 방번호
	private String type; 	// 방종류
	private String name; 	// 투숙객 이름
	
	// 생성자

	public Room02() {
		super();
	}
	
	public Room02(int num, String type) {
		super();
		this.num = num;
		this.type = type;
	}

	// getter, setter
	public int getNum() {
		return num;
	}

	public void setNum(int num) {
		this.num = num;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return "Room02 [num=" + num + ", type=" + type + ", name=" + name + "]";
	}
	
} // Room 클래스
public class HotelTest02 {
	private Map<Integer, Room> hotelMap;
	private Scanner scan;
	
	// 생성자 
	public HotelTest() {
		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;
				hotelMap.put(roomNum, new Room(roomNum, roomType));
			}
		}
	} // 생성자 끝
	
	public static void main(String[] args) {
		new HotelTest().hotelStart();
	} // mian문
	
	public void hotelStart() {
		System.out.println();
		System.out.println("*********************************************");
		System.out.println("\t호텔문을 열었습니다. 어서오십시요.");
		System.out.println("*********************************************");
		System.out.println();
		
		while (true) {
			int choice = displayMenu();
			
			switch (choice) {
			case 1: checkIn(); // 체크인 	
				break;
			case 2: checkOut();	// 체크아웃 	
				break;
			case 3: printRoomState(); // 객실 상채  	
				break;
			case 4:
				System.out.println("*********************************************");
				System.out.println("\t호텔문을 닫았습니다.");
				System.out.println("*********************************************");
				System.out.println();
				return;
			default: System.out.println("작업 번호를 잘못 입력했습니다. 다시 입력하세요.");
			}
		} // while문
	} // hotelStart()
	
	// 객실 상태 출력하기
	private void printRoomState() {
		// 방번호를 오름차순으로 출력하기 위해서 방번호(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("방 번호\t방 종류\t투숙객 이름");
		System.out.println("------------------------------------------------------");
		
		// List에서 방번호를 하나씩 꺼내와 Map에서 해당 방번호에 짝이되는 Room 객체를 구해서 출력한다.
		for (int roomNum : roomNumList) {
			Room02 r = hotelMap.get(roomNum);
			System.out.print(r.getNum() + "\t");
			System.out.print(r.getType() + "\t");
			System.out.println(r.getName() == null ? " -" : r.getName());
		}
		System.out.println("------------------------------------------------------");
	} // printRoomState()
	
	// 체크아웃 메서드
	private void checkOut() {
		System.out.println("------------------------------------------------------");
		System.out.println("체크아웃 작업");
		System.out.println("------------------------------------------------------");
		System.out.println("체크아웃 할 방 번호를 입력하세요.");
		System.out.print("방번호 입력 >> ");
		int num = scan.nextInt();
		
		// 입력한 방이 존재하는지 여부 검사 
		if (!hotelMap.containsKey(num)) {
			System.out.println(num + "호 객실은 존재하지 않습니다.");
			return; 
		}
		
		// 입력한 방번호 객실에 손님이 없는지 여부 검사
		if (hotelMap.get(num).getName() == null) {
			System.out.println(num + "호 객실에 체크인 한 손님이 없습니다.");
			return;
		}
		
		String name = hotelMap.get(num).getName();	// 현재 투숙객 이름 구하기
		
		// 체크아웃 작업은 해당 객실의 투숙객 이름에 null 값을 넣어주면 된다.
		hotelMap.get(num).setName(null);
		
		System.out.println(num + "호 객실의 " + name + "님이 체크아웃을 완료했습니다.");
	} // checkOut()

	// 체크인 메서드
	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의 key값이 방번호이므로 해당 방번호가 key값에 존재하는지 여부 검사)
		if (!hotelMap.containsKey(num)) {
			System.out.println(num + "호 객실은 존재하지 않습니다.");
			return; 
		}
		
		// 입력한 방번호 객실에 손님이 있는지 여부 검사
		if (hotelMap.get(num).getName() != null) {
			System.out.println(num + "호 객실에 이미 손님이 있습니다.");
			return;
		}
		
		System.out.println();
		System.out.println("누구를 체크인 하시겠습니까?");
		System.out.print("이름 입력 >> ");
		String name = scan.next();
		
		// 입력받은 투숙객 이름을 해당 객실의 투숙객 명단에 넣는다.
		hotelMap.get(num).setName(name);
		System.out.println(num +"호 객실에 " + name + "씨의 체크인이 완료되었습니다.");
				
	} // checkIn()

	// 메뉴를 출력하고 사용자가 입력한 작업 번호를 번환하는 메서드
	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("선택 >> ");
		return scan.nextInt();
	} // displayMenu()
}