본문 바로가기
Android (Kotlin)/mini projects

[Hotel Reservation] 호텔 예약 프로그램 lv2.0

by 키윤 2023. 12. 2.
lv2
1. 메뉴에서 2번을 눌러 호텔 예약자 목록을 보여줘요. (예시. 1. 사용자: ㅇㅇㅇㅇ, 방 번호: ㅇㅇㅇ호, 체크인: 2023-07-21. 체크아웃: 2023-08-01) 메뉴에서 3번을 눌러 호텔 예약자 목록을 정렬 기능을 사용하여 체크인 날짜순으로 오름차순으로 정렬해 봐요
2. 예약 플로우를 수정해 봐요. 해당 체크인 체크아웃 날짜에 선택한 방 번호를 예약 가능한지 불가능한지 판단하게 변경해 봐요.
3. 예약이 불가능하면 체크인, 체크아웃 날짜를 변경해서 다시 검사해 보는 플로우를 만들어봐요.

수정된 부분

  1. 메인 메뉴에서 4번을 누르면 코드가 종료되도록 바꾸어주었다
  2. 메인 메뉴 선택 부분의 코드를 if 문에서 when 문으로 바꾸어주었다. 가독성이 높아짐.
  3. 호텔 예약 부분에서 입력 받은 고객 정보를 bookingInfo에 저장하였다. 각 checkIfValid 함수의 출력값이 생겨서 checkIfValid 의 부모 함수 및 모든 객체를 수정해 주었다.
  4. 2번인 예약 목록 추가 와 3번인 예약 목록 (정렬) 추가 클래스를 각각 만들어 주었다.

느낀점

  1. 정보를 저장하는 부분은 data class로 뺄 수 있다는 사실을 배웠다. data class에 대해 더 공부해보고 응용해서 넣어보면 좋을 것 같다.
  2. 예약 목록을 정렬할 줄 모르겠다.... 어떻게 하는거임... 기본 알고리즘 문제에서 나올법한 문제인데 한시간을 고민해도 안돼서 현타가 왔다....ㅜㅜ 
  3. 코드가 정말 정말 길어졌다. 내가 썼으니까 대충 이해가 되는건데 실전에 들어가면 다른 사람이 작성한 코드도 이해해야한다는 사실에 압도되는 느낌이 든다. 나.. 잘 할 수 있겠지...??
package com.example.hotelreservationprogramme

import android.content.res.TypedArray

fun main() {
    // 첫번째 실행 (메뉴 선택)


    val menuObject = MainMenu()
    menuObject.mainMenu()

    println("호텔 프로그램을 종료합니다.")
}

class MainMenu {
    fun mainMenu() {

        var bookingInfo: MutableList<BookingInfo> = mutableListOf()

        while (true) {
            println("호텔예약 프로그램 입니다.")
            println("1. 방예약, 2. 예약목록 출력, 3 예약목록 (정렬) 출력, 4. 시스템 종료, 5. 금액 입금-출금 내역 목록 출력 6. 예약 변경/취소")

            val readLineExceptionInt = ReadLineExceptionInt()
            val menu = readLineExceptionInt.checkIfValid()

            when (menu) {
                1 -> { // 방 예약
                    val menu1 = Menu1()
                    bookingInfo.add(menu1.menu1())
                    println(bookingInfo)
                }

                2 -> { // 예약목록 출력
                    val menu2 = Menu2()
                    menu2.menu2(bookingInfo)
                }

                3 -> { // 예약목록 (정렬) 출력
                    val menu3 = Menu3()
                    menu3.menu3(bookingInfo)
                }
                4 -> break // 시스템 종료
                5 -> { // 금액 입금-출금 내역 목록 출력

                }
                6 -> { // 예약 변경/취소

                }
                else -> {}
            }
        }

    }
}

class Menu1 {
    fun menu1(): List<Any> {

        var bookingInfo: MutableList<Any> = mutableListOf()
        val readLinExceptionInt = ReadLineExceptionInt()

        println("예약자분의 성함을 입력해주세요.")
        val name = readLine()!!
        bookingInfo.add(name)

        println("예약할 방번호를 입력해주세요.")
        var roomNumber = readLinExceptionInt.checkIfValid()
        val roomNumberObject = RoomNumber()
        roomNumber = roomNumberObject.checkIfValid(roomNumber)
        bookingInfo.add(roomNumber)

        println("체크인 날짜를 입력해주세요 표기형식. 20230631")
        var checkInDate = readLinExceptionInt.checkIfValid()
        val checkInDateObject = CheckInDate()
        checkInDate = checkInDateObject.checkIfValid(checkInDate)
        bookingInfo.add(checkInDate)


        println("체크아웃 날짜를 입력해주세요 표기형식. 20230631")
        var checkOutDate = readLinExceptionInt.checkIfValid()
        val checkOutDateObject = CheckOutDate()
        checkOutDate = checkOutDateObject.checkIfValid(checkInDate, checkOutDate)
        bookingInfo.add(checkOutDate)

        return bookingInfo
    }
}

class Menu2 {
    fun menu2(bookingInfo: MutableList<List<Any>>) {
        println("호텔 예약자 목록입니다.")
        for (i in 0 until bookingInfo.size) {
            println("${i + 1}. 사용자: ${bookingInfo[i][0]}, 방번호: ${bookingInfo[i][1]}호, 체크인: ${bookingInfo[i][2]}, 체크아웃: ${bookingInfo[i][3]}")
        }
    }
}
class Menu3 {
    fun menu3(bookingInfo: MutableList<List<Any>>) {
        var bookingInfo = bookingInfo
        bookingInfo.sortBy{ it.checkInDate }
        for (i in 0 until bookingInfo.size) {
            println("${i + 1}. 사용자: ${bookingInfo[i][0]}, 방번호: ${bookingInfo[i][1]}호, 체크인: ${bookingInfo[i][2]}, 체크아웃: ${bookingInfo[i][3]}")
        }
    }
}

data class BookingInfo(var name:String, var roomNumber: Int, var checkInDate: Int, var checkOutDate: Int)

abstract class CheckIfValid {
    abstract fun checkIfValid(): Int
    abstract fun checkIfValid(value1: Int): Int
    abstract fun checkIfValid(value1: Int, value2: Int): Int
    var todayDate: Int = 20231201
}

class RoomNumber : CheckIfValid() {
    override fun checkIfValid(): Int {
        TODO("Not yet implemented")
    }

    override fun checkIfValid(value1: Int): Int {
        var roomNumber = value1
        val readLineExceptionInt = ReadLineExceptionInt()
        while (true) {
            if (roomNumber in 100 until 10000) {
                return roomNumber
            } else {
                println("올바르지 않은 방번호 입니다. 방번호는 100~999 영역 이내입니다.")
                roomNumber = readLineExceptionInt.checkIfValid()
            }
        }
    }

    override fun checkIfValid(value1: Int, value2: Int): Int {
        TODO("Not yet implemented")
    }
}

class CheckInDate : CheckIfValid() {
    override fun checkIfValid(): Int {
        TODO("Not yet implemented")
    }

    override fun checkIfValid(value1: Int): Int {
        var checkInDate = value1
        val readLineExceptionInt = ReadLineExceptionInt()

        while (true) {
            if (checkInDate > todayDate) {
                return checkInDate
            } else {
                println("체크인은 지난날은 선택할 수 없습니다.")
                checkInDate = readLineExceptionInt.checkIfValid()
            }
        }
    }

    override fun checkIfValid(value1: Int, value2: Int): Int {
        TODO("Not yet implemented")
    }
}

class CheckOutDate : CheckIfValid() {
    override fun checkIfValid(): Int {
        TODO("Not yet implemented")
    }

    override fun checkIfValid(value1: Int): Int {
        TODO("Not yet implemented")
    }

    override fun checkIfValid(value1: Int, value2: Int): Int {
        val checkInDate = value1
        var checkOutDate = value2
        val readLineExceptionInt = ReadLineExceptionInt()

        while (true) {
            if (checkOutDate > checkInDate) {
                return checkOutDate
            } else {
                println("체크인 날짜보다 이전이거나 같을 수는 없습니다. ")
                checkOutDate = readLineExceptionInt.checkIfValid()
            }
        }
    }
}

class ReadLineExceptionInt : CheckIfValid() {
    override fun checkIfValid(): Int {
        while (true) {
            try {
                val num = readLine()!!.toInt()
                return num
            } catch (e: java.lang.NumberFormatException) {
                println("숫자를 입력하세요.")
            }
        }
    }

    override fun checkIfValid(value1: Int): Int {
        TODO("Not yet implemented")
    }

    override fun checkIfValid(value1: Int, value2: Int): Int {
        TODO("Not yet implemented")
    }
}