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

[Hotel Reservation] 호텔 예약 프로그램 lv.1.0

by 키윤 2023. 12. 1.
lv1 과제

1. 사용자가 호텔 예약을 할 수 있는 메뉴를 표시하세요. (번호는 1~6번까지 만들어봐요.)
2. 메뉴에서 4번을 누르면 호텔 예약 프로그램을 종료할 수 있어요
3. 예약 플로우는 성함을 입력받고 방 번호를 입력받고 체크인 날짜를 입력받고 체크아웃 날짜를 입력받아요
4. 1번을 눌러 방 예약을 받을 수 있도록 구현해 봐요
5. 방 번호는 100~999호실까지 존재해요
6. 체크인 날짜는 지금 날짜와 비교해서 이전날짜는 입력받을 수 없고 체크아웃 날짜는 체크인 날짜보다 이전이거나 같을 수는 없어요
7. 입력이 완료되면 임의의 금액을 지급해 주고 랜덤으로 호텔 예약비로 빠져나가도록 구현해 봐요

출력값 예시

 

  1. 처음 접근할 때에는 전부다 main function에 넣어서 1단계 로직의 흐름대로 코드를 작성했다. 그러고 공통 되는 부분을 확인하고 어느 부분이 클래스로 빠질 수 있는지 그리고 어느 부분을 abstract 클래스로 뺄지 판단을 내렸다.
  2. 가장 먼저 menu에서 1을 선택하면 입력해야하는 일렬의 값들이 있다. 그리고 menu2를 선택했을 떄에도 마찬가지일 것이다.
  3. 그래서 menu를 하나의 클래스(MainMenu)로 빼고 그 안에서 1-6까지의 값을 선택함에 따라 다른 함수를 실행 할 수 있도록 했다. (이 코드는 if문을 활용하였다)
  4. MainMenu 입력값이 1인 경우에는 Menu1클래스가 실행 되도록 if문 안에 객체를 선언해주고 함수를 실행 시켰다.
  5. Menu1 내부에서는 이름, 룸넘버, 체크인날짜 그리고 체크아웃 날짜를 받는데 각각 입력한 값이 맞는지 확인을해줘야하는 과정이 공통으로 있었다. 그래서 입력값 확인 when (true) 문을 클래스로 빼기로 했다. 이때 추상 클래스를 사용해주면 좋을 거 같아서 추상클래스 CheckIfValid 과 이 추상 클래스에 상속되는 RoomNumber, CheckInDate, CheckOutDate 클래스를 선언해주었다. 
  6. RoomNumber이랑 CheckInDate와 달리 CheckOutDate의 함수는 매개변수가 2개 필요했다. 그래서 오버로딩을 이용하여 추상클래스에 이름은 같지만 매개변수의 갯수가 다른 추상 함수를 추상클래스 안에 정의해주었다.
  7. 추상클래스에 함수가 두개 있는 탓에 사용하지 않는 함수를 RoomNUmber, CheckInDate 그리고 CheckOutDate에 멤버를 만들어야 에러가 사라졌다. 이 부분은 추가적으로 더 단순화 할 수 있으면 좋을 거 같다.
  • 추가적으로 try catch문을 사용해볼 수 있을 거 같다.

 

package com.example.hotelreservationprogramme

fun main() {
    // 첫번째 실행 (메뉴 선택)
    println("호텔예약 프로그램 입니다.")
    println("1. 방예약, 2. 예약목록 출력, 3 예약목록 (정렬) 출력, 4. 시스템 종료, 5. 금액 입금-출금 내역 목록 출력 6. 예약 변경/취소")
    var mainMenu: Int = readLine()!!.toInt()
    var menuObject = MainMenu(mainMenu)
    menuObject.mainMenu(mainMenu)

    println("호텔 예약이 완료되었습니다.")
}

class MainMenu(menu: Int) {
    fun mainMenu(menu: Int) {
        while (true) {
            if (menu == 1) {
                var menu1 = Menu1()
                menu1.menu1()
                break
            } else if (menu == 2) {
                println("--"); break
            } else if (menu == 3) {
                println("--"); break
            } else if (menu == 4) {
                println("--"); break
            } else if (menu == 5) {
                println("--"); break
            } else if (menu == 6) {
                println("--"); break
            } else {
                println("--"); break
            }
        }
    }
}

class Menu1 {
    fun menu1() {

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

        println("예약할 방번호를 입력해주세요.")
        var roomNumber = readLine()!!.toInt()
        var roomNumberObject = RoomNumber()
        roomNumberObject.checkIfValid(roomNumber)

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

        println("체크아웃 날짜를 입력해주세요 표기형식. 20230631")
        var checkOutDate = readLine()!!.toInt()
        var checkOutDateObject = CheckOutDate()
        checkOutDateObject.checkIfValid(checkInDate, checkOutDate)
    }

}

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

class RoomNumber() : CheckIfValid() {
    override fun checkIfValid(roomNumber: Int) {
        var roomNumber = roomNumber
        while (true) {
            if (roomNumber in 100 until 10000) {
                break
            } else {
                println("올바르지 않은 방번호 입니다. 방번호는 100~999 영역 이내입니다.")
                roomNumber = readLine()!!.toInt()
            }
        }
    }

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

class CheckInDate() : CheckIfValid() {
    override fun checkIfValid(checkInDate: Int) {
        var checkInDate = checkInDate
        while (true) {
            if (checkInDate > todayDate) {
                break
            } else {
                println("체크인은 지난날은 선택할 수 없습니다.")
                checkInDate = readLine()!!.toInt()
            }
        }
    }

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

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

    override fun checkIfValid(checkInDate: Int, checkOutDate: Int) {
        var checkInDate = checkInDate
        var checkOutDate = checkOutDate
        while (true) {
            if (checkOutDate > checkInDate) {
                break
            } else {
                println("체크인 날짜보다 이전이거나 같을 수는 없습니다. ")
                checkOutDate = readLine()!!.toInt()
            }
        }
    }
}

출력값