🍥구현 기능
🍥구현하기
PaymentManager 클래스
- 결제 관련 기능을 구현한 클래스
- 프로퍼티:
- 메소드:
- getBalance():Int
현재 잔고 반환
- deposit(money:Int):Int
현재 잔고에 money 입금 후, 잔고 반환
- withDraw(money:Int):Boolean
현재 잔고에서 money 출금 후
출금에 성공한 경우 true 반환, 잔고가 부족하여 출금에 실패한 경우 false 반환
class PaymentManager {
private var balance = 0
fun getBalance():Int = balance
fun deposit(money:Int):Int{
balance += money
return balance
}
fun withDraw(money:Int):Boolean{
if(balance < money) return false
balance -= money
return true
}
}
➖
OrderScreen 클래스
- run():String이 input을 반환하도록 수정
override fun run():String{
isShoppingCartEmpty = MyKiosk.shoppingCart.isEmpty()
val input = getInput()
return input
}
OrderPaymentScreen 클래스
- 주문하기 화면과 주문 완료 화면 사이에 주문 결제 화면 추가
- 주문하기 위해 필요한 금액 출력
- 현재 잔고가 부족하지 않은 경우, 바로 결제 진행 후 주문 완료 화면으로 이동
- 현재 잔고가 부족한 경우, 잔고가 부족하지 않을 때까지 추가 금액 입금 받기
[주문 결제 화면]
주문하기 위해 필요한 금액은 30000원 입니다.
현재 잔고는 32000원 입니다.
결제가 진행 중입니다...
[주문 결제 화면]
주문하기 위해 필요한 금액은 30000원 입니다.
현재 잔고는 15000원 입니다.
추가로 입금할 금액을 입력해주세요.(단위: 원)
-> 10000
현재 잔고는 25000원 입니다.
추가로 입금할 금액을 입력해주세요.(단위: 원)
-> 100000
현재 잔고는 35000원 입니다.
결제가 진행중입니다...
- Screen 클래스 상속
- 프로퍼티:
- costSum
장바구니 속 메뉴 아이템 가격의 총합
- balance
현재 잔고
- 메소드:
- run():String
주문 결제 화면 실행
잔고가 주문하기 위해 필요한 금액보다 크거가 같을 때까지 입력받은 후, 결제 진행
- getInput():String
주문 결제 화면에 알맞는 입력값 받기
(가능한 입력값: 금액을 입력받아야 하므로, Int로 형변환이 되는 입력값)
- printScreen()
주문 결제 화면 출력
class OrderPaymentScreen : Screen() {
var costSum = 0
var balance = 0
override fun run(): String {
costSum = MyKiosk.shoppingCart.getCostSum()
balance = MyKiosk.paymentManager.getBalance()
printScreen()
while(balance < costSum) {
val money = getInput()
balance = MyKiosk.paymentManager.deposit(money.toInt())
println("현재 잔고는 ${balance}원 입니다.")
}
println("결제가 진행중입니다...")
if(MyKiosk.paymentManager.withDraw(costSum)) return "true"
return "false"
}
override fun getInput(): String {
var input = ""
while(true){
println("추가로 입금할 금액을 입력해주세요.(단위: 원)")
print("->")
input = readLine()?.toString() ?: ""
try{
input.toInt()
break
}catch(e:Exception){
println("잘못된 입력입니다.")
}
}
return input
}
override fun printScreen() {
println("[주문 결제 화면]")
println("주문하기 위해 필요한 금액은 ${costSum}원 입니다.")
println("현재 잔고는 ${balance}원 입니다.")
}
}
OrderCompleteScreen 클래스
[주문 완료 화면]
주문이 완료되었습니다.
현재 잔고는 5000원 입니다.
잠시 후 첫 화면으로 이동합니다...
override fun printScreen(){
println("[주문 완료 화면]")
println("주문이 완료되었습니다.")
println("현재 잔고는 ${MyKiosk.paymentManager.getBalance()}원 입니다.")
println("잠시 후 첫 화면으로 이동합니다...")
}
➖
MyKiosk 클래스
- 프로퍼티에 orderPaymentScreen 추가
- companion object 프로퍼티에 paymentManager 추가
- orderScreen.run()의 반환값이 "p"일 때, orderPaymentScreen.run()이 호출되도록 수정
- orderPaymentScreen.run()의 반환값이 "true"일 때, orderCompleteScreen.run()이 호출되도록 수정
class MyKiosk private constructor(){
private val firstScreen = FirstScreen()
private val takeOutScreen = TakeOutScreen()
private val mainScreen = MainScreen()
private val selectMenuScreen = SelectMenuScreen()
private val shoppingCartScreen = ShoppingCartScreen()
private val orderScreen = OrderScreen()
private val orderPaymentScreen = OrderPaymentScreen()
private val orderCompleteScreen = OrderCompleteScreen()
companion object{
private var instance:MyKiosk? = null
fun newInstance():MyKiosk{
if(instance == null) instance = MyKiosk()
return instance!!
}
val myMenu = MyMenu()
val shoppingCart = MenuItemCollection()
val paymentManager = PaymentManager()
var isTakeOut:Boolean = false
}
fun run(){
firstLoop@ while(true){
firstScreen.run()
takeOutLoop@ while(true) {
shoppingCart.clearMenuItemList()
val takeOutResult = takeOutScreen.run()
when(takeOutResult) {
"1" -> isTakeOut = false
"2" -> isTakeOut = true
"q" -> continue@firstLoop
}
mainLoop@ while (true) {
val mainResult = mainScreen.run()
when (mainResult) {
"c" -> shoppingCartScreen.run()
"o" -> {
val orderResult = orderScreen.run()
when(orderResult) {
"b" -> continue@mainLoop
"p" ->{
val orderPaymentResult = orderPaymentScreen.run()
if(orderPaymentResult == "true") break@mainLoop
else continue@mainLoop
}
}
}
"b" -> continue@takeOutLoop
"q" -> continue@firstLoop
else -> selectMenuScreen.run(mainResult)
}
}
orderCompleteScreen.run()
continue@firstLoop
}
}
}
}