수정된 부분
- 클래스의 주생성자를 정리해주었다! 어차피 클래스 내부에 있는 함수의 매개변수에 값이 들어가기 때문에 장황하게 클래스 주생성자에도 변수들을 표시해 줄 필요가 없었다.
- try catch문을 이용하여 입력된 값이 정수인지 확인해 줄 수 있는 클래스를 만들었고 모든 readLine()!!.toInt()에 적용시켜 주었다.
코드 분석
- 각 객체에 단일책임원칙에 따라 한가지 기능을 수행하는 함수를 하나씩 넣었다.
- 개방 폐쇄 원칙에 따라 작성:
- 확장에 열려있다: lv1.0에서 lv1.1으로 수정할 때 ReadLineExceptionInt라는 클래스를 추가하고 원래 있었던 부모 추상 클래스 CheckIfValid에 상속시켰다. ->기존 코드 수정없이 기능 확장을 하였다.
- 변경에 닫혀있다: 기능에 변경 사항이 발생했을 떄 main함수 안에 수정할 필요없이 객체를 직접적으로 수정해야한다. - 의존 역전의 법칙에 따라서 추상클래스를 만들고 그 안에 상속 되어있는 객체에 각각 기능을 하나씩 추가하였다. 한가지 아쉬운 점은 MainMenu클래스랑 Menu1 클래스가 조금 따로 논다는 점.. 흠...
느낀점
- 차근차근 클래스 하나씩 추가하고 에러를 하나씩 해결해 나가는 맛이 있고 완성했을 때(오류 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")
}
}
'Android (Kotlin) > mini projects' 카테고리의 다른 글
[Hotel Reservation] 호텔 예약 프로그램 lv.2.1 (0) | 2023.12.03 |
---|---|
[Hotel Reservation] 호텔 예약 프로그램 lv2.0 (0) | 2023.12.02 |
[Hotel Reservation] 호텔 예약 프로그램 lv.1.0 (0) | 2023.12.01 |
[Calculator] 계산기 만들기 lv.4 (0) | 2023.11.30 |
[Calculator] 계산기 만들기 lv.3 (0) | 2023.11.30 |