호텔 예약 프로그래밍 서비스 만들기
- (미)완성본
- 에러 1 : originCheckOut > checkIn.originCheckIn - 체크아웃 날짜가 체크인 날짜보다 이전이면 안되게 하려면?
① while(true) 안에 있는 변수는 다른 while 구문에서 쓰지 못함!
→ val myCheckOut = inputMyInfo("checkOut", myCheckIn) as LocalDate
myCheckIn 변수 > checkInDate에 적용 > originCheckOut과 myCheckIn을 비교하게 함!
import java.time.LocalDate
import java.time.format.DateTimeFormatter
fun inputMyInfo(type: String, **checkInDate: LocalDate?**): Any? {
**val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")**
return when(type) {
"checkIn" -> {
println("체크인 날짜를 입력해주세요. 표기 형식 : 2023-07-20")
while(true) {
try {
**val originCheckIn = LocalDate.parse(readLine(), formatter)**
val localDate: LocalDate = LocalDate.now()
if (originCheckIn > localDate) {
return originCheckIn
} else {
println("체크인은 지난 날은 선택할 수 없습니다. 다시 입력해주세요.")
}
} catch(e:Exception) {
println("체크인 날짜를 다시 입력해주세요. 표기 형식 : 2023-07-20")
}
}
}
"checkOut" -> {
println("체크아웃 날짜를 입력해주세요. 표기 형식 : 2023-07-20")
while(true) {
try {
**val originCheckOut = LocalDate.parse(readLine(), formatter)
if (originCheckOut > checkInDate) {**
return originCheckOut
} else {
println("체크인 날짜보다 이전이거나 같을 수 없습니다. 다시 입력해주세요.")
}
} catch(e:Exception) {
println("체크 아웃 날짜를 다시 입력해주세요. 표기 형식 : 2023-07-20")
}
}
}
else -> {
return "no"
}
}
}
- 에러 2 : reservationList 구현
① 모든 예약 내역을 저장하려면 접근 가능한 메인 함수에 위치해야 함
package com.example.hoterreservation
import java.time.LocalDate
import java.time.format.DateTimeFormatter
class Reservation {
var name: String = ""
var roomNumber: Int = 0
var checkIn: LocalDate = LocalDate.now()
var checkOut: LocalDate = LocalDate.now()
}
fun main() {
**val reservationList = mutableMapOf<String, Any?>()**
println("호텔 예약 서비스입니다.")
println("메뉴를 선택하세요.")
when (inputInfo("selectNumber", reservationList)) {
1 -> {
val myName = inputMyInfo("name", null, reservationList).toString()
val myRoomNumber = inputMyInfo("roomNumber", null, reservationList).toString().toInt()
val myCheckIn = inputMyInfo("checkIn", null, reservationList).toString()
val myCheckOut = inputMyInfo("checkOut", LocalDate.parse(myCheckIn), reservationList).toString()
val myMoney = inputMyInfo("money", null, reservationList).toString().toInt()
// 예약금 10만원으로 고정
val money = myMoney - 100000
println("예약이 완료되었습니다.")
println("이름: $myName")
println("객실 번호: $myRoomNumber")
println("체크인 날짜: $myCheckIn")
println("체크아웃 날짜: $myCheckOut")
println("잔액: $money")
// Store reservation information in the 'reservationList'
reservationList["name"] = myName
reservationList["roomNumber"] = myRoomNumber
reservationList["checkIn"] = LocalDate.parse(myCheckIn)
reservationList["checkOut"] = LocalDate.parse(myCheckOut)
}
4 -> return println("종료합니다.")
else -> println("올바른 메뉴 번호를 선택하세요.")
}
}
- 에러 3 : [4] 시스템 종료 클릭 시 프로그램 종료 구현
→ loop in the
main
function
fun main() {
val reservationList = mutableMapOf<String, Any?>()
println("호텔 예약 서비스입니다.")
**while (true)** {
println("메뉴를 선택하세요.")
when (inputInfo("selectNumber")) {
1 -> {
val myName = inputMyInfo("name", null).toString()
val myRoomNumber = inputMyInfo("roomNumber", null).toString().toInt()
val myCheckIn = inputMyInfo("checkIn", null).toString()
val myCheckOut = inputMyInfo("checkOut", LocalDate.parse(myCheckIn)).toString()
val myMoney = inputMyInfo("money", null).toString().toInt()
// 예약금 10만원으로 고정
val money = myMoney - 100000
println("예약이 완료되었습니다.")
println("이름 : $myName")
println("객실 번호 : $myRoomNumber")
println("체크인 날짜 : $myCheckIn")
println("체크아웃 날짜 : $myCheckOut")
println("잔액 : $money")
reservationList["name"] = myName
reservationList["roomNumber"] = myRoomNumber
reservationList["checkIn"] = myCheckIn
reservationList["checkOut"] = myCheckOut
}
2 -> print(reservationList)
4 -> {
println("종료합니다.")
**break**
}
else -> println("올바른 메뉴 번호를 선택하세요.")
}
}
}
- 에러 4 : [3] 예약 목록 정렬 구현 - sortByAscending 사용하고 싶었으나, 에러 발생
fun main() {
val reservationList = mutableListOf<Reservation>()
println("호텔 예약 서비스입니다.")
while (true) {
println("메뉴를 선택 하세요.")
when (inputInfo("selectNumber")) {
1 -> {
val myName = inputMyInfo("name", null).toString()
val myRoomNumber = inputMyInfo("roomNumber", null).toString().toInt()
val myCheckIn = inputMyInfo("checkIn", null) as LocalDate
val myCheckOut = inputMyInfo("checkOut", myCheckIn) as LocalDate
val myMoney = inputMyInfo("money", null).toString().toInt()
// 예약금 10만원으로 고정
val money = myMoney - 100000
println("예약이 완료되었습니다.")
println("이름 : $myName")
println("객실 번호 : $myRoomNumber")
println("체크인 날짜 : $myCheckIn")
println("체크아웃 날짜 : $myCheckOut")
println("잔액 : $money")
**val reservation = Reservation()
reservation.name = myName
reservation.roomNumber = myRoomNumber
reservation.checkIn = myCheckIn
reservation.checkOut = myCheckOut
reservation.money = money
reservationList.add(reservation)**
}
2 -> printReservationList(reservationList)
3 -> {
**val sortedList = reservationList.sortedBy { it.checkIn }
printReservationList(sortedList)**
}
4 -> {
println("종료합니다.")
return
}
else -> println("올바른 메뉴 번호를 선택 하세요.")
}
}
}
**fun printReservationList(reservations: List<Reservation>) {
for ((index, reservation) in reservations.withIndex()) {
println("Reservation ${index + 1}")
println("이름: ${reservation.name}")
println("객실 번호: ${reservation.roomNumber}")
println("체크인 날짜: ${reservation.checkIn}")
println("체크아웃 날짜: ${reservation.checkOut}")
println("잔액: ${reservation.money}")
println()**
**}
}**
- 에러 5 : ‘Unresolved reference: add’ → Reservation 클래스에 constructor 추가하여 값을 추가할 수 있도록 함
import java.time.LocalDate
import java.time.format.DateTimeFormatter
class Reservation {
var name: String = ""
var roomNumber: Int = 0
var checkIn: LocalDate = LocalDate.now()
var checkOut: LocalDate = LocalDate.now()
var money: Int = 0
**constructor(name: String, roomNumber: Int, checkIn: LocalDate, checkOut: LocalDate, money: Int) {
this.name = name
this.roomNumber = roomNumber
this.checkIn = checkIn
this.checkOut = checkOut
this.money = money**
}
}
- 에러 6 : ‘sortedBy - Unresolved reference. None of the following candidates is applicable because of receiver type mismatch’ 에러 발생
① reservationList를 mutableMap으로 생성 → mutableList 로 변경
- 에러 7 : ‘val reservation = Reservation() - No value passed for parameter 'checkIn'’ 에러 발생
fun main() {
val reservationList = mutableListOf<Reservation>()
println("호텔 예약 서비스입니다.")
while (true) {
println("메뉴를 선택 하세요.")
when (inputInfo("selectNumber")) {
1 -> {
val myName = inputMyInfo("name", null).toString()
val myRoomNumber = inputMyInfo("roomNumber", null).toString().toInt()
val myCheckIn = inputMyInfo("checkIn", null) as LocalDate
val myCheckOut = inputMyInfo("checkOut", LocalDate.parse(myCheckIn.toString())) as LocalDate
val myMoney = inputMyInfo("money", null).toString().toInt()
**// Reservation object 생성(readLine에 입력된 값을 받는 변수)
val reservation = Reservation(myName, myRoomNumber, myCheckIn, myCheckOut, myMoney)
// readLine에 입력 된 값 reservation에 저장 → 이를 reservationList에 추가
reservationList.add(reservation)**
}
- 에러 8 : [2] 예약 목록 출력 누르면 [com.example.hoterreservation.Reservation@754ba872] 이렇게 나옴
→ Reservation 클래스의 toString() 메소드가 Reservation object들의 ‘주소’를 보여주기 때문에 그럼
→ toString() 메소드를 오버라이딩해서 주소 값 말고 실제 값을 보여주도록 함