오늘은 어제에 이어서 키오스크 프로그래밍을 만들었다.
그리고 지금까지 만들어본 내용을 팀원들과 공유해보고, 서로 피드백을 주고받으며 내가 너무 이상하게 했다고 생각해서 많은것을 바꿨다.
먼저 어제는 메뉴판이 필요할때마다 아래 그림처럼 직접 print해서출력해줬다.

팀원들의 도움을 받아 메뉴판클래스를 하나 만들어서, 거기에 내용을 전부 적었다.
class MenuUI {
fun mainMenu(){
println("[ MOM'S TOUCH ]")
println("1. Burgers | 햄버거")
println("2. Chickens | 치킨")
println("3. Drinks | 음료")
println("4. SideMenu | 사이드메뉴")
println("0. 종료 | 프로그램 종료")
}
fun burgerMenu(){
println("[ Bergers Menu ]")
println("1. 싸이버거 | W4,600 | 바삭하고 매콤한 치킨 패티와 신선한 양상추가 조화를 이루는 맘스터치 시그니처 버거.")
println("2. 인크레더블버거 | W5,700 | 프리미엄 더블햄, 에그프라이, 통다리살 패티에 아삭아삭한 양상추와 양파까지, 풍성한 버거.")
println("3. 화이트갈릭버거 | W5,200 | BEST 화이트갈릭이 싸이버거로 재탄생! 더블햄, 통다리살, 화이트갈릭소스의 환상 조합")
println("0. 뒤로가기 | 뒤로가기")
}
}
이런식으로 메인메뉴판, 햄버거메뉴판, 치킨메뉴판 등등의 메뉴판 내용을 따로 만들어서 적어뒀다.
그리고, 메뉴판만 따로 적어둔것이 아니라 메뉴 내용 클래스를 만들어서 각각의 정보 또한 리스트에 넣어뒀다.
object MenuInfo {
val burgerInfo = arrayListOf(
Burger("싸이버거", 4600, "바삭하고 매콤한 치킨 패티와 신선한 양상추가 조화를 이루는 맘스터치 시그니처 버거"),
Burger("인크레더블버거", 5700, "프리미엄 더블햄, 에그프라이, 통다리살 패티에 아삭아삭한 양상추와 양파까지, 풍성한 버거"),
Burger("화이트갈릭버거", 5200, "BEST 화이트갈릭이 싸이버거로 재탄생! 더블햄, 통다리살, 화이트갈릭소스의 환상 조합"),
)
}
이렇게 리스트에 햄버거에 관한 내용을 언제든 꺼내서 쓸 수 있게 미리 넣어두었다.
이렇게 줄인 결과 메인 클래스에서 첫번째 그림처럼 보이던 수많은 print문들이
//메인 메뉴판 불러오기
menuUI.mainMenu()
간단한 한줄로 바꿀 수 있었다.
그리고, 각 메뉴의 정보를 출력할때 또한
val otherChoice = choiceNumber("otherChoice").toString().toInt()
when(otherChoice){
in 1..MenuInfo.burgerInfo.size-> {
MenuInfo.burgerInfo[otherChoice - 1].displayInfo()
intoOrder()
val orderOrCancle = choiceNumber("orderOrCancle").toString().toInt()
when (orderOrCancle) {
1 -> {
order.addOrder(MenuInfo.burgerInfo[otherChoice - 1])
println("주문목록에 ${MenuInfo.burgerInfo[otherChoice - 1].name}를 추가했습니다.")
}
else -> {
println("취소")
}
}
}
}
숫자를 입력받고, 해당 숫자에 대한 값을 미리 저장해두었던 리스트에서 가져와 출력해줬다.
이렇게 모든 작업을 반복하니 메인함수의 코드수가 3분의2가량이 줄었다.!
여기까지가 긴 코드를 줄인 부분이고, 어제에 이어서 필수구현 부분을 살펴보면
내가 구현하는 맘스터치 키오스크에는 총 4개의 음식 종류가 있다. 햄버거, 치킨, 사이드, 음료. 그리고 각각의 종류에 3개의 상세메뉴가 존재한다.
이 4가지 종류 모두 메장에서 판매하는 메뉴라는 공통점을 가지고 있어서, Menu라는 부모클래스를 만들어줬고, Burger, Chicken, drink, Side클래스들을 상속시켜줬다.
open class Menu(val name:String, val price:Int, val description:String) {
fun displayInfo(){
println("[$name] | W$price | $description")
}
}
class Burger (name:String, price:Int, description : String): Menu(name, price, description){
}
이렇게 해서 Burger클래스에서도 Menu부모클래스에서 만든 메소드 displayInfo를 사용할 수 있게 하였다.
그리고 MyOrder데이터클래스를 만들어서 데이터들의 형태를 정해줬고, myOrders리스트를 선언해서 형식은 Myorder데이터클래스로 하여 리스트를 만들어줬다.
data class MyOrder(
val name: String,
val price: Int,
val description: String,
var myMoney: Int,
var priceSum:Int
)
public val myOrders: MutableList<MyOrder> = mutableListOf()
숫자를 입력해야하는데 문자를 입력했을때의 예외처리는 0단계에서 미리 생각했던 문제였고, 어제만든choiceNumber함수에서 예외처리를 해줬다.
구매 가능한 상태에 대해서는 나는 우선 사용자에게 20,000원이라는 돈을 줬다.
isMyMoneyOk라는 함수를 만들어서 myOrders리스트에서 내가 고른 상품들의 가격들을 가져와서 sum변수에 합쳐줘서 장바구니에 있는 상품들의 가격의 총합을 저장했다. 그후 내 돈이 sum보다 같거나 많다면 주문이 처리되는 형식으로 코드를 작성했다.
fun isMyMoneyOk(){
var sum = 0
for (myOrder in myOrders) {
sum += myOrder.price
}
if(myMoney >= sum){
println("주문이 완료되었습니다.")
myMoney -= sum
println("남은잔고 : ${myMoney}")
myOrders.clear()
orderCount++
}else{
var needMoney = sum - myMoney
println("현재 잔액은 ${myMoney} 으로 ${needMoney}이 부족해서 주문할 수 없습니다.")
}
}
특정 작업종료후 3초뒤 다른작업을 수행하는코드를 나는 한가지 일을 끝낸후에, 다시 메뉴판으로 돌아올때 3초 딜레이를 넣기로 했다.
menuUI.mainMenu()를 이용해서 메뉴판을 불러오기 전에 Thread.sleep(3000)를 먼저 써서 3초간 딜레이를 주었다. ()안에는 1000당 1초로 작동한다.
프로그램을 종료할때 까지 5초마다 현재 주문 대기수를 출력해주는 프로그램은 코루틴을 사용해서 비동기적으로 메서드를 실행시켜줬다.
suspend fun waitingOrder(){
runBlocking {
launch {
while (true){
println("현재 주문 대기수 : $orderCount")
delay(5000)
}
}
}
}
이렇게 waitingOrder메서드를 불러와 5초마다 orderCount를 불러와서 출력시켜주었다. 여기서 orderCount는 lv4에서 구현한 isMyMoney메서드에서 내가 어떤 메뉴를 주문한다면 1씩 늘려주었다.
결제시 시간을 비교해서 특정시간대에는 결제할 수 없다는 알림창을 띄우게 하는 부분은
val currentTime = LocalDateTime.now()
val formatter = DateTimeFormatter.ofPattern("HHmm")
val formattedcurrentTime = currentTime.format(formatter).toInt()
val formatter1 = DateTimeFormatter.ofPattern("HH시mm분")
val formattedcurrentTime1 = currentTime.format(formatter1)
if(formattedcurrentTime > 1730 && formattedcurrentTime < 1750){
println("현재 시각은 $formattedcurrentTime1 입니다.")
println("은행 점검 시간은 17시30분 ~ 17시 50분 이므로 결제할 수 없습니다.")
}else{
order.isMyMoneyOk()
}
주문을 할때 조건을 넣어줬다. LocalDateTime을 이용해서 현재 시간 정보를 가져오고, formatter를 이용해서 현재 시간을 어떤식으로 표현할지 정해준다. 나는 formatter를 두번 선언했는데, 하나는 "HHmm", 다른하나는 "HH시mm분"형식으로 해줬다. 그 이유는 현재 시간을 알려줄때, 현재시간이 20시37분 이라면 "현재 시작은 2037 입니다." 라고 표현해주면 너무 어색할거같아서 "HH시mm분"형식을 하나더 만들어서 현재시각을"현재 시작은 20시37분 입니다."로 출력해주었다.
그리고 특정 시각은 은행점검이라고 예를 들었고, 현재 시간이 해당시간 사이에 있다면 주문이 불가능하게 만들어주었다.
오늘은 과제를 하면서 처음으로 팀원들과 내가 어느정도했는지, 서로의 결과물? 이 아닌 진행도를 공유하였고, 서로 어떤식으로 코드를 짯는지 확인하는 시간을 가졌다. 그런 과정에서 나는 엄청 복잡하게 한 부분을 팀원분은 한줄로 해결했네!? 이런 점을 찾을 수 있었고, 내 코드가 더 가독성있게 만들어준 시간이였던 것 같다.
내일, 키오스크 프로그래밍을 마지막 단계까지 구현해보고, 이쁘게 가꿔서 좋은 결과물을 만들어보고싶다.
코드리뷰로 시너지 폭발!