[Android / Kotlin] 키오스크 프로그램 구현 (3)

Subeen·2023년 12월 8일
0

Kotlin 문법

목록 보기
15/23

Cart.kt

선택한 메뉴 카테고리의 아이템 목록을 보여주는 부분에서 선택한 아이템을 장바구니에 담는 부분을 추가로 구현했다. Cart 클래스는 장바구니에 아이템을 담고 장바구니 목록을 보여주고 가격의 총합을 보여주기 위한 클래스이다.

class Cart {
    private val cartList = ArrayList<AbstractMenu>()

    fun addItem(item: AbstractMenu?) {
        if (item == null) {
            println("선택하신 상품이 존재하지 않습니다. 관리자에게 문의해주세요.")
        } else {
            cartList.add(item)
        }
    }

    fun checkAddItem(item: AbstractMenu?): Boolean {
        if (item == null) {
            println("선택하신 상품이 존재하지 않습니다. 관리자에게 문의해주세요.")
            return false
        } else {
            println(
                "\"${MenuManage(item).displayInfo()}\"\n" +
                        "위 메뉴를 장바구니에 추가하시겠습니까?\n" +
                        "1. 확인    2. 취소"
            )
            while (true) {
                val input = readln()
                var select: Int
                if (input.isNumber()) {
                    select = input.toInt()
                } else {
                    continue
                }
                return when (select) {
                    1 -> {
                        println("${item.name}이(가) 장바구니에 추가되었습니다.")
                        true
                    }

                    2 -> {
                        false
                    }

                    else -> {
                        println("잘 못 된 번호를 입력했어요. 다시 입력해주세요.")
                        continue
                    }
                }
            }
        }
    }

    fun displayCart() {
        if (cartList.isEmpty()) {
            println("장바구니가 비어 있습니다.")
        } else {
            var total: Int = 0
            cartList.forEach { item ->
                total += item.price
                println(MenuManage(item).displayInfo())
            }

            println("\n[ Total ]\n" +
                    "₩ $total")
        }
    }
}

MainProduct.kt

이전에는 메뉴 아이템에 관련 된 부분과 메인 카테고리를 보여주는 부분을 한 클래스 안에 구현하였는데 메인 카테고리를 보여주는 부분을 분리하였고 사용자가 메뉴 카테고리를 선택했을 때 카테고리의 타이틀을 출력해주는 함수를 추가하였다.

class MainProduct {
    private val mainList = mutableMapOf<String, String>()
    private var mapKeys = listOf<String>()
    private var mapValues = listOf<String>()

    init {
        initMainList()
    }

    private fun initMainList() {
        mainList["Burger"] = "주문 즉시 바로 조리해 더욱 맛있는, 맥도날드의 다양한 버거를 소개합니다."
        mainList["Side & Dessert"] = "버거와 함께 즐기면 언제나 맛있는 사이드와 디저트 메뉴!"
        mainList["Mac Cafe & Beverage"] = "언제나 즐겁게, 맥카페와 다양한 음료를 부담없이 즐기세요!"
        mainList["Order"] = "장바구니를 확인 후 주문합니다."
        mainList["Cancel"] = "진행중인 주문을 취소합니다."


        mapKeys = mainList.keys.toList()
        mapValues = mainList.values.toList()
    }


    fun displayMain() {
        println(
            "\n아래 메뉴판을 보시고 메뉴를 골라 입력해주세요. \n\n" +
                    "[ McDonald's's MENU ]"
        )
        for (i in 0 until mainList.size) {
            println("%d. %-20s | %s".format(i + 1, mapKeys[i], mapValues[i]))
        }
    }

    fun displayTitle(index: Int) {
        if (index < 0 || index > mainList.size) {
            return
        }
        println("[${mapKeys[index - 1]} MENU]")
    }
}

Kiosk.kt

fun main() {
    val productManage = ProductManage()
    val mainProduct = MainProduct()
    val cart = Cart()

    while (true) {
        mainProduct.displayMain()
        val input = readln()
        var select: Int
        if (input.isNumber()) {
            select = input.toInt()
        } else {
            continue
        }

        mainProduct.displayTitle(select)

        when (select) {
            1 -> {
                val menu = "burger"
                productManage.displayMenu(menu)

                while (true) {
                    val enter = readln()
                    var number: Int
                    if (enter.isNumber()) {
                        number = enter.toInt()
                    } else {
                        continue
                    }

                    if (number == 0) {
                        break
                    } else if (number < 0 || number > productManage.getMenuCount(menu)) {
                        println("잘 못 된 번호를 입력했어요. 다시 입력해주세요.")
                    } else {
                        val item = productManage.getSelectedItem(menu, number)
                        if (cart.checkAddItem(item)) {
                            cart.addItem(item)
                        }
                        break
                    }
                }
            }

            2 -> {
                val menu = "fried"
                productManage.displayMenu(menu)

                while (true) {
                    val enter = readln()
                    var number: Int
                    if (enter.isNumber()) {
                        number = enter.toInt()
                    } else {
                        continue
                    }

                    if (number == 0) {
                        break
                    } else if (number < 0 || number > productManage.getMenuCount(menu)) {
                        println("잘 못 된 번호를 입력했어요. 다시 입력해주세요.")
                    } else {
                        val item = productManage.getSelectedItem(menu, number)
                        if (cart.checkAddItem(item)) {
                            cart.addItem(item)
                        }
                        break
                    }
                }
            }

            3 -> {
                val menu = "beverage"
                productManage.displayMenu(menu)

                while (true) {
                    val enter = readln()
                    var number: Int
                    if (enter.isNumber()) {
                        number = enter.toInt()
                    } else {
                        continue
                    }

                    if (number == 0) {
                        break
                    } else if (number < 0 || number > productManage.getMenuCount(menu)) {
                        println("잘 못 된 번호를 입력했어요. 다시 입력해주세요.")
                    } else {
                        val item = productManage.getSelectedItem(menu, number)
                        if (cart.checkAddItem(item)) {
                            cart.addItem(item)
                        }
                        break
                    }
                }
            }

            4 -> {  // Order
                cart.displayCart()
            }

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

            else -> {
                println("잘 못 된 번호를 입력했어요. 다시 입력해주세요.")
            }
        }
    }

}

실행 결과

실행 결과를 보면 아이템을 출력할 때 아이템 이름 영역의 길이를 맞추는 부분이나 가격을 출력할 때 3자리 단위로 쉼표를 표시하지 못 하는게 아쉬워 우선적으로 수정해야겠다는 생각이 든다. 🤔

아래 메뉴판을 보시고 메뉴를 골라 입력해주세요. 

[ McDonald's's MENU ]
1. Burger               | 주문 즉시 바로 조리해 더욱 맛있는, 맥도날드의 다양한 버거를 소개합니다.
2. Side & Dessert       | 버거와 함께 즐기면 언제나 맛있는 사이드와 디저트 메뉴!
3. Mac Cafe & Beverage  | 언제나 즐겁게, 맥카페와 다양한 음료를 부담없이 즐기세요!
4. Order                | 장바구니를 확인 후 주문합니다.
5. Cancel               | 진행중인 주문을 취소합니다.
1
[Burger MENU]
1. Big Mac    | ₩ 5500 | 100% 순 쇠고기 패티 두 장에 치즈, 양상추, 피클
2. McCrispy Deluxe Burger | ₩ 6800 | 100% 통다리살 케이준 치킨 패티, 포테이포 브리오쉬 번
3. McSpicy Shanghai Burger | ₩ 5500 | 100% 닭가슴살 통살 위에 양상추, 토마토, 치킨 패티
0. 뒤로가기       | 뒤로가기
2
"McCrispy Deluxe Burger | ₩ 6800 | 100% 통다리살 케이준 치킨 패티, 포테이포 브리오쉬 번"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인    2. 취소
1
McCrispy Deluxe Burger이(가) 장바구니에 추가되었습니다.

아래 메뉴판을 보시고 메뉴를 골라 입력해주세요. 

[ McDonald's's MENU ]
1. Burger               | 주문 즉시 바로 조리해 더욱 맛있는, 맥도날드의 다양한 버거를 소개합니다.
2. Side & Dessert       | 버거와 함께 즐기면 언제나 맛있는 사이드와 디저트 메뉴!
3. Mac Cafe & Beverage  | 언제나 즐겁게, 맥카페와 다양한 음료를 부담없이 즐기세요!
4. Order                | 장바구니를 확인 후 주문합니다.
5. Cancel               | 진행중인 주문을 취소합니다.
2
[Side & Dessert MENU]
1. Cheese Sticks - 2조각   | ₩ 2000 | 자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱
2. Cheese Sticks - 4조각   | ₩ 4200 | 자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱
3. McNuggets - 4조각   | ₩ 2600 | 바삭하고 촉촉한 치킨이 한 입에 쏙
4. McNuggets - 6조각   | ₩ 3800 | 바삭하고 촉촉한 치킨이 한 입에 쏙
0. 뒤로가기       | 뒤로가기
1
"Cheese Sticks - 2조각   | ₩ 2000 | 자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인    2. 취소
1
Cheese Sticks이(가) 장바구니에 추가되었습니다.

아래 메뉴판을 보시고 메뉴를 골라 입력해주세요. 

[ McDonald's's MENU ]
1. Burger               | 주문 즉시 바로 조리해 더욱 맛있는, 맥도날드의 다양한 버거를 소개합니다.
2. Side & Dessert       | 버거와 함께 즐기면 언제나 맛있는 사이드와 디저트 메뉴!
3. Mac Cafe & Beverage  | 언제나 즐겁게, 맥카페와 다양한 음료를 부담없이 즐기세요!
4. Order                | 장바구니를 확인 후 주문합니다.
5. Cancel               | 진행중인 주문을 취소합니다.
4
[Order MENU]
McCrispy Deluxe Burger | ₩ 6800 | 100% 통다리살 케이준 치킨 패티, 포테이포 브리오쉬 번
Cheese Sticks - 2조각   | ₩ 2000 | 자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱

[ Total ]
₩ 8800
profile
개발 공부 기록 🌱

0개의 댓글