[TIL]Kotlin 키오스크 구현하기 2

지혜·2023년 12월 6일

Android_TIL

목록 보기
12/70

✏231206 수요일 TIL(Today I learned) 오늘 배운 것

📖기본 기능 구현 - Lv2. 필요한 클래스 설계

package com.example.mykiosk

fun main() {


    val menu = Menu(name = "", price = 0)
    val burger = Burger(burgerName = "", burgerPrice = 0)
    val mcCafe = McCafe(mcCafeName = "", mcCafePrice = 0)

    val orderCart = OrderCart(menu)
    val bugerOrder = OrderCart(burger)
    val mcCafeOrder = OrderCart(mcCafe)



    println("")
    println("[맥도날드 키오스크]")
    while (true) {

        println("")
        println("---------------------------------------------------------------------------------------------")
        println("[전체 메뉴 : 번호를 입력하시면 상세 메뉴 페이지로 이동합니다.]")
        println("[1] 햄버거 단품 : 주문 즉시 조리하는 햄버거 ")
//        println("[2] 햄버거 세트 : 햄버거 + 감자튀김 + 음료 세트")
        println("[3] 맥카페 : 다양한 음료")
//        println("[4] 사이드 : 디저트 및 사이드 메뉴")
//        println("[5] 맥모닝 : 새벽 4시부터 오전 10시30분까지 주문 가능")
        println("")
        println("[주문 : 주문 완료를 위해 올바른 번호를 입력해주세요.]")
        println("[9] 장바구니로 이동하여 결제")
        println("[0] 주문 취소 및 프로그램 종료")

        var selectMainMenu = InputNumber().inputNumber("selectInt").toString().toInt()

        when (selectMainMenu) {
            1 -> {
                println("햄버거 단품의 상세 페이지로 이동합니다.")
                bugerOrder.detailedOrder(burger)
                burger.detailedBurger()

            }

            3 -> {
                println("맥카페의 상세 페이지로 이동합니다.")
                mcCafeOrder.detailedOrder(mcCafe)
                mcCafe.detailedMcCafe()


            }

            9 -> {
                println("주문내역을 확인합니다.")
                orderCart.detailedOrder(menu)
            }

            0 -> {
                println("프로그램이 종료됩니다.")
                break
            }

            else -> {
                println("잘못된 번호입니다. 올바른 번호를 입력해주세요.")
            }

        }
    }

}

package com.example.mykiosk

class InputNumber {

    fun inputNumber(type: String): Any? {
        return when (type) {
            "selectInt" -> {
                println("원하는 번호를 입력해주세요.")
                while (true) {
                    try {
                        var selectInt: String? = readLine()
                        return selectInt?.toInt() ?: -1
                    } catch (e: Exception) {
                        println("올바른 번호를 다시 선택해주세요. 숫자만 입력 가능 합니다.")
                    }
                }
            }

            "selectDouble" -> {
                println("원하는 번호를 입력해주세요.")
                while (true) {
                    try {
                        var selectDouble: String? = readLine()
                        return selectDouble?.toDouble() ?: -1
                    } catch (e: Exception) {
                        println("올바른 번호를 다시 선택해주세요. 숫자(소수점 가능)만 입력 가능 합니다.")
                    }
                }
            }

            else -> {
                return "no"
            }

        }
    }


}

package com.example.mykiosk

open class Menu(var name : String, var price : Int)  {

}
package com.example.mykiosk

class Burger(var burgerName: String, var burgerPrice: Int) : Menu(burgerName, burgerPrice) {
    val orderCart = OrderCart(this)
    fun detailedBurger() {


        val sanghai = Burger("맥스파이시 상하이 버거 단품", 5500)
        val deluxe = Burger("맥크리스피 디럭스 버거 단품", 6800)



        while (true) {
            println("")
            println("---------------------------------------------------------------------------------------------")
            println("[햄버거 단품 메뉴 목록]")
            println("[1] ${sanghai.burgerName}: ${sanghai.burgerPrice}원 ")
            println("[2] 맥크리스피 디럭스 버거 단품: 6,800원")
            println("")
            println("[8] 장바구니 확인하기")
            println("[9] 메인메뉴로 돌아가기")
            println("[0] 프로그램 종료")

            var selectBurgerMenu = InputNumber().inputNumber("selectInt").toString().toInt()

            when (selectBurgerMenu) {
                1 -> {
                    order(sanghai)
                }

                2 -> {
                    order(deluxe)
                }

                8 -> {
                    orderCart.detailedOrder(this)
                }

                9 -> {
                    println("메인메뉴로 돌아갑니다.")
                    return
                }

                0 -> {
                    println("프로그램을 종료합니다.")
                    break
                }

                else -> {
                    println("잘못된 번호입니다. 올바른 번호를 입력해주세요.")
                }

            }
        }
    }

    fun order(burger: Burger) {
        println("")
        println("${burger.burgerName}${burger.burgerPrice}원 입니다. 장바구니에 추가하시겠습니까?")
        println("[1] 추가 [2] 취소")

        var selectBurgerOrder = InputNumber().inputNumber("selectInt").toString().toInt()

        when (selectBurgerOrder) {
            1 -> {
                orderCart.addToCart(burger.burgerName, burger.burgerPrice)
                println("${burger.burgerName} 장바구니 추가 완료!")
            }

            2 -> {
                println("취소하셨습니다. 이전 메뉴로 돌아갑니다.")
                return
            }
        }

    }
}
package com.example.mykiosk

class McCafe(var mcCafeName : String, var mcCafePrice : Int) : Menu(mcCafeName,mcCafePrice) {

    val orderCart = OrderCart(this)

    fun detailedMcCafe() {


        val dripHot = McCafe("Hot-드립커피", 2000)
        val dripIce = McCafe("Ice-드립커피", 1800)

        while (true) {
            println("")
            println("---------------------------------------------------------------------------------------------")
            println("[맥카페 메뉴 목록]")
            println("[1.1] Hot-드립커피 : 2,000원")
//            println("[1.2] Ice-드립커피 : 1,800원")
//            println("[2.1] Hot-드립커피 : 2,000원")
            println("[2.2] Ice-드립커피 : 1,800원")
            println("")
            println("[9] 메인메뉴로 돌아가기")
            println("[0] 프로그램 종료")

            var selectMcCafeMenu = InputNumber().inputNumber("selectDouble").toString().toDouble()

            when (selectMcCafeMenu) {
                1.1 -> {
                    order(dripHot)
                }

                2.2 -> {
                    order(dripIce)
                }
                9.0 -> {
                    println("메인메뉴로 돌아갑니다.")
                    return
                }

                0.0 -> {
                    println("프로그램을 종료합니다.")
                    break
                }

                else -> {
                    println("잘못된 번호입니다. 올바른 번호를 입력해주세요.")
                }

            }
        }
    }

    fun order(mcCafe :McCafe) {
        println("")
        println("${mcCafe.mcCafeName}${mcCafe.mcCafePrice}원 입니다. 장바구니에 추가하시겠습니까?")
        println("[1] 추가 [2] 취소")

        var selectBurgerOrder= InputNumber().inputNumber("selectInt").toString().toInt()

        when(selectBurgerOrder) {
            1 -> {
                orderCart.addToCart(mcCafe.mcCafeName, mcCafe.mcCafePrice)
                println("${mcCafe.mcCafeName} 장바구니 추가 완료!")
                orderCart.detailedOrder(this)

            }

            2-> {
                println("취소하셨습니다. 이전 메뉴로 돌아갑니다.")
                return
            }
        }

    }
}


package com.example.mykiosk

class OrderCart(private val menu: Menu) {
    var orderList = mutableMapOf<String,Int>()

    fun addToCart(name:String,price : Int) {
        orderList.put(name,price)
        var order = orderList.keys
        println("${order} 가 장바구니에 담겼습니다.")

    }

    fun detailedOrder(menu: Menu) {
        println("아래와 같이 주문하시겠습니까?")
        orderList.forEach{ name,price ->
                println("$name ($price)")
            }
        println("총 가격은 ${orderList.values.sum()}")
    }

}

📖Lv2. 문제 발생 및 해결

  1. 오늘 코드는 완성코드가 아니고 오늘까지 한 내용 백업 코드이다. 제일 문제인건 OrderCart클래스. 장바구니 담는 것 때문에 시행착오가 많았고, 아직도 시행착오 중인 코드.. 장바구니 문제 외에 메뉴를 선택하는 것들은 문제가 없긴하다.

  2. OrderCart클래스에서 장바구니역할을 할 orderList를 map으로 선언해줬다. addToCart 펑션으로 map이니까 put()을 사용해서 버거,음료 등 상세메뉴선택에서 이름과 가격 값을 넣어주는데 까지는 됐는데! 그 넣어준 값이 addToCart 펑션 안에서 끝났다. 같은 클래스안에 있는 detailedOrder()까지 값이 저장이 안됐다.
    => 왜냐면.. OrderCart클래스를 변수에 인스턴스로 저장해서 값이 저장되게 했어야 했는데, 그냥 OrderCart().detailedOrder()로 직접 연결해버리니까 값이 저장될 틈없이 새로 불러오고 새로불러와서 저장이 안되는 거였다. 괜히 클래스를 변수에 담아서 사용하는게 아니었다. 주의해야겠다.

  3. 근데 그렇게 변수 선언해서 orderCart.detailedOrder()를 연결해줬더니 딱 변수 선언한 클래스에서만 값이 유효했다. 전체적으로 값이 공유가 안된다.
    =>팀원들과 코드 공유하는 시간에 얘기해봤는데, 사실 지금 형태로는 Burger따로 McCafe따로 있어서 당연히 전체적으로 값을 공유할 수 없는 상황이라고 하셨다. 상속을 받는다고 자식 클래스들 끼리 묶이는 건 아니니까.. 이건 내일 할 일을 통해서 해결하도록 하겠다.


📖Lv2.내일 할 일

  • 전체리스트를 하나로 만들어서 제네릭으로 카테고리를 통제하는 방법으로 각 카테고리 상세 메뉴를 부르는 방법으로 변경하면, 자연스럽게 하나의 카트를 사용할 수 있는 모양도 만들 수 있을 것같다. 그리고 사실 이게 Lv3에서 요구하는 내용이기도 하다. Lv3을 잘 구현하기가 내일 목표!


[+ 오늘의 느낀점]

  • 오늘도 힘들었다. 뭘 물어보려고 해도 뭐가 문제인지 파악도 못하는 그런 느낌? 그래도 팀원분들이랑 얘기를 나누면서 많이 정리가 됐다. 그 때 들은 이야기인데 장바구니를 써서 주문목록을 출력하는건 Lv4에서 요구하는 사항이라고 한다. 이번 과제는 레벨이 나뉘어져있긴 하지만 다 이어져 있는 내용을 쪼갠 것 같아서 계산기 때처럼 딱. 하나하고 다음 이런게 안된다.. 그래서 더 너무 어렵게 느껴지는 것 같다. 어제부터 정리해서 모양을 그려보고 코드를 작성하겠다고 다짐했지만, 애초에 정리가 잘 안된다.ㅎㅎ 능력 부족을 확실하게 느낀다.. 붕붕 떠있는 지식으로 구체적인 결과물을 만드려니까 마음도 불편하고 시간은 시간대로 가는 것 같고.. 키오스크 과제를 시작한 순간부터 마음이 불편하다.. 그래도 팀원들과 얘기해봤을 때 아예 딴 길로 빠진 건 아닌 것 같았다. 어짜피 지금은 배우는 과정인거니까 내일부터는 조금 가벼운 기분으로 기운내서 다시 하나씩 찬찬히 해나가야겠다. 화이팅!!
profile
파이팅!

0개의 댓글