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

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

by 키윤 2023. 12. 2.

수정된 부분

  1. 클래스의 주생성자를 정리해주었다! 어차피 클래스 내부에 있는 함수의 매개변수에 값이 들어가기 때문에 장황하게 클래스 주생성자에도 변수들을 표시해 줄 필요가 없었다.
  2. try catch문을 이용하여 입력된 값이 정수인지 확인해 줄 수 있는 클래스를 만들었고 모든 readLine()!!.toInt()에 적용시켜 주었다.

코드 분석

  1. 각 객체에 단일책임원칙에 따라 한가지 기능을 수행하는 함수를 하나씩 넣었다. 
  2. 개방 폐쇄 원칙에 따라 작성:
    - 확장에 열려있다: lv1.0에서 lv1.1으로 수정할 때 ReadLineExceptionInt라는 클래스를 추가하고 원래 있었던 부모 추상 클래스 CheckIfValid에 상속시켰다. ->기존 코드 수정없이 기능 확장을 하였다. 
    - 변경에 닫혀있다: 기능에 변경 사항이 발생했을 떄 main함수 안에 수정할 필요없이 객체를 직접적으로 수정해야한다.
  3. 의존 역전의 법칙에 따라서 추상클래스를 만들고 그 안에 상속 되어있는 객체에 각각 기능을 하나씩 추가하였다. 한가지 아쉬운 점은 MainMenu클래스랑 Menu1 클래스가 조금 따로 논다는 점.. 흠...

느낀점

  1. 차근차근 클래스 하나씩 추가하고 에러를 하나씩 해결해 나가는 맛이 있고 완성했을 때(오류 0개) 뿌듯한 것 같다
package com.example.hotelreservationprogramme

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

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

class MainMenu {
    fun mainMenu(menu: Int) {
        while (true) {
            if (menu == 1) {
                val 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() {

        val readLinExceptionInt = ReadLineExceptionInt()

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        while (true) {
            if (checkOutDate > checkInDate) {
                break
            } 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) {
        TODO("Not yet implemented")
    }

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