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

지혜·2023년 12월 5일

Android_TIL

목록 보기
11/70

✏231205 화요일 TIL(Today I learned) 오늘 복습한 것

📖기본 기능 구현 - Lv1. 메뉴 출력 및 입력 받기

[메뉴 번호 입력 받을 때 예외 처리]

package com.example.mykiosk

class InputNumber {

    fun inputNumber(type: String): Any? {
        return when (type) {
            "selectMainMenu" -> {
                println("이동하실 화면의 숫자를 입력하세요.")
                while (true) {
                    try {
                        var selectMainMenu: String? = readLine()
                        return selectMainMenu?.toInt() ?: -1
                    } catch (e: Exception) {
                        println("올바른 번호를 다시 선택해주세요.")
                    }
                }
            }

            "selectBurgerMenu" -> {
                println("이동하실 화면의 숫자를 입력하세요.")
                while (true) {
                    try {
                        var selectBurgerMenu: String? = readLine()
                        return selectBurgerMenu?.toInt() ?: -1
                    } catch (e: Exception) {
                        println("올바른 번호를 다시 선택해주세요.")
                    }
                }
            }

            "selectMcCafeMenu" -> {
                println("이동하실 화면의 숫자를 입력하세요.")
                while (true) {
                    try {
                        var selectMcCafeMenu: String? = readLine()
                        return selectMcCafeMenu?.toDouble() ?: -1
                    } catch (e: Exception) {
                        println("올바른 번호를 다시 선택해주세요.")
                    }
                }
            }

            else -> {
                return "no"
            }

        }
    }


}
  • 문자를 입력했을 때 다시 입력할 수 있도록 예외처리를 했다.
  • 지금은 mainMenu, burgerMenu, mcCafeMenu 마다 번호를 받는 것으로 구분하여 작성해두었지만, 소수점자리 숫자를 필요로해서 toDouble()을 사용하는 mcCafeMenu를 빼면 똑같은 모양을 사용하고 있어서, 후에 int형과 double형 2가지로 타입을 나눌 수 있도록 수정할 것이다.

[메인메뉴]

package com.example.mykiosk

fun main() {


    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("selectMainMenu").toString().toInt()

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

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

            }

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

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

        }
    }
}
  • 지금은 메뉴 이동이 제대로 되는지 확인하기 위해서 버거와 음료 두 부분만 입력을 받을 수 있도록 했다.
  • InputNumber클래스에서 예외처리를 완료한 번호 입력을 받아서 when이 작동하도록 했다.
  • 사용하지 않을 때 프로그램이 정상종료 될 수 있도록 0 에 break를 걸었다.
  • else를 통해 무의미한 입력을 방지하고 다시 메뉴를 고를 수 있도록 예외처리를 했다.

[버거 메뉴]

package com.example.mykiosk

class Burger() {
    fun detailedBurger() {

        while (true) {
            println("")
            println("---------------------------------------------------------------------------------------------")
            println("[햄버거 단품 메뉴 목록]")
            println("[1] 맥스파이시 상하이 버거 단품: 5,500원 ")
            println("[2] 맥크리스피 디럭스 버거 단품: 6,800원")
            println("")
            println("[9] 메인메뉴로 돌아가기")
            println("[0] 프로그램 종료")

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

            when (selectBurgerMenu) {
                1 -> {
                    println("맥스파이시 상하이 버거 단품 (5,500원)을 선택하셨습니다. 장바구니에 담으시겠습니까?")
                }

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

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

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

            }
        }
    }

}
  • 메인메뉴와 마찬가지로 InputNumber클래스에서 예외처리를 완료한 번호 입력을 받아서 when이 작동하도록 했다. 그 외에 프로그램 종료와 무의미한입력에 대한 예외처리도 똑같이 처리했다.
  • 메인메뉴로 다시 돌아갈 수 있도록 9 에 return을 걸어줬다.

[음료 메뉴]

package com.example.mykiosk

class McCafe {
    fun detailedMcCafe() {
        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("selectMcCafeMenu").toString().toDouble()

            when (selectMcCafeMenu) {
                1.1 -> {
                    println("Hot-드립커피(2,000원)을 선택하셨습니다. 장바구니에 담으시겠습니까?")

                }

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

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

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

            }
        }
    }

}
  • 기본적인 구성은 버거 메뉴와 동일 하나, 아이스와 핫의 구분을 위해 when의 타입을 소수점 모양으로 받았다. 따라서 InputNumber클래스에서도 toDouble()을 사용하여 입력을 받는 방식을 썼다.

📖Lv1. 문제 발생

  • 일단 아까 위에도 언급했듯이, InputNumber클래스를 따로 뺀 건 좋은데, 메뉴마다 하나씩 예외처리를 해주니까 중복된 모양이 발생해서, 내일 Int형과 Double형으로 다시 처리해 줄 것이다.

  • 지금보니까 음료메뉴도 1번 2번들이 동일한 값이다. 이것도 내일 코드를 완성하면서 제대로 다듬어야겠다.

  • 메뉴의 입출력과 자유로운 이동은 구현은 나름 쉽게 했다.. 그 후에
    <각 메뉴를 클래스로 만들어서 그에 대한 정보값을 저장하고, 특정 메뉴들을 선택하여 그 선택한 값들을 장바구니에 따로 저장해두고, 장바구니에 저장한 값들을 통해 계산처리를 하는 것>
    을. 사실. 오늘 시도해봤다.. 이전에 만들었던 계산기구현을 참고해서 추상메서드도 만들고, 연결해봤더니 계산기는 값을 저장하기 보다는 각 클래스에서 계산한 값을 반환해주는거라 생각한 모양이 안나왔다.

📖내일 해야할 일

  • 좀 더 체계적으로 클래스 간의 관계를 설정하고, 돌아가는 모양을 생각한 후에 작성을 시작했어야했는데, 마음이 급해서 얼렁뚱땅 시작했더니 삭제하고 다시 쓰고, 지웠다가 후회하고 난리도 아니였다. 지금 이렇게 글을 쓰면서 한 번 정리가 된 것 같으니 내일 다시 적용해보고 장바구니까지 구현할 수 있도록 하겠다!
profile
파이팅!

0개의 댓글