2023.12.05(화) TIL

quinones·2023년 12월 5일

오늘은 첫 조별과제인 키오스크 프로그래밍을 만들어보았다.
원하는 가게, 원하는 메뉴로 키오스크를 만들어서 주문하거나 취소할수 있도록 해야했다.

lv0 예외처리

  • 요구사항별로 상세 기능을 생각하세요.
  • 사용하면서 발생할 수 있는 예외상황들을 생각해요.

여기서 메뉴를 화면에 띄워주고, 입력받을때 메뉴가 1번부터 3번까지 있다면 다른 숫자가 선택되거나 숫자가 아닌 다른 string값이 받아진다면, 예외처리를 해야한다.

lv1 조건문 사용

  • 입력받은 숫자에 따라 다른 로직을 실행하는 코드를 작성하세요.
  • if나 when을 사용하세요.

나는 먼저 while문을 이용해서 사용자가 종료하기 전까지 계속 메뉴를 띄웠다.

while(true){
	println("아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.")
	println()
	println("[ MOM'S TOUCH ]")
	println("1. Burgers     | 햄버거")
	println("2. Chickens    | 치킨")
	println("3. Drinks      | 음료")
	println("4. SideMenu    | 사이드메뉴")
	println("0. 종료         | 프로그램 종료")
}

그 후에 숫자를 입력받는데, lv0에서 말한것처럼 예외처리를 해줬다.

val mainChoice = choiceNumber("mainChoice").toString().toInt()

fun choiceNumber(type:String): Int{
    when(type){
        "mainChoice" -> {
            while (true){
                try {
                    val mainChoice:String? = readLine()
                    val result = mainChoice?.toInt() ?: -1
                    if(result > 4 || result < 0){
                        println("범위를 확인하고 다시 골라주세요")
                    }else{
                        return result
                    }
                }catch (e: Exception){
                    println("숫자로 입력해주세요")
                }
            }
        }
   }

메뉴판에서 0번은 종료, 1~4번은 메뉴선택, 그외의 범위의 숫자를 고른다면 범위를 다시 확인해달라, string값이 골라진다면 숫자로 입력해달라는 print문을 입력해서 예외처리를 해줬다.

lv2 클래스 설계

  • 필요한 클래스들을 설계하세요.(버거, 음료, 주문, 등등)
  • 클래스들의 프로퍼티와 메소드를 정의해요.

먼저 모든 음식들은 메뉴라는 공통점이 있어, AbstractMenu라는 추상클래스로 만들어줬다.

abstract class AbstractMenu(val name:String, val price:Int) {
    abstract fun displayInfo()
}

displayInfo함수는 어차피 자식 클래스에서 재선언될 예정이기에 따로 구현하지는 않았다.

class Burger (name:String, price:Int, val description : String): AbstractMenu(name, price){
    override fun displayInfo() {
        println("[$name] | W$price | $description")
        println("위 메뉴를 장바구니에 추가하시겠습니까?")
        println("1. 확인       2. 취소")
    }
}

하나의 메뉴가 선택되면(여기선 버거) displayInfo()함수를 재정의 해서 해당 메뉴의 이름, 가격, 설명을 print해준다.

메뉴판에서 1. Burger를 누르면 1. 싸이버거, 2. 인크레더블버거, 3. 화이트갈릭버거, 0. 뒤로가기 이런 새로운 메뉴판이 나오고, 여기서 만약 1번을 선택하게되면

1-> {
    val burger = Burger("싸이버거", 4600, "바삭하고 매콤한 치킨 패티와 신선한 양상추가 조화를 이루는 맘스터치 시그니처 버거.")
    burger.displayInfo()
    val orderOrCancle = choiceNumber("orderOrCancle").toString().toInt()
    when(orderOrCancle){
        1 -> {
            order.addOrder("싸이버거", 4600, "바삭하고 매콤한 치킨 패티와 신선한 양상추가 조화를 이루는 맘스터치 시그니처 버거.")
            println("주문목록에 ${burger.name}를 추가했습니다.")
        }
        else -> {
            println("취소")
        }
    }
}

이런식으로 Burger클래스에 이름과 설명은 String형태로, 가격은 Int형으로 넣어주고, displayInfo()함수를 불러서 해당 메뉴에 대해 설명을 다시한번 해준다. 사용자에게 해당 주문을 장바구니에 추가할지 물어보고, 입력받아 만약 1번 확인을 눌렀다면 order클래스에 addOrder함수를 불러와서 리스트에 해당 메뉴를 넣어준다.

data class MyOrder(
    val name: String,
    val price: Int,
    val description: String,
    var myMoney: Int,
    var priceSum:Int
)
class Order(){
    public val myOrders: MutableList<MyOrder> = mutableListOf()

    fun addOrder(name: String, price: Int, description: String, priceSum:Int? = null) {
        var myMoney = 20000
        var priceSum = 0
        val myOrder = MyOrder(name, price, description, myMoney, priceSum)
        myOrders.add(myOrder)
    }
}

MyOrder데이터 클래스를 만들어줘서 리스트에 들어갈 데이터 형식을 만들어주고, myOrders리스트를 MyOrder데이터 형태로 초기화 해준다. addOrder함수는 이름, 가격, 설명을 받아오고, 내돈을 초기 20,000원으로 설정, 총 가격을 0원으로 설정해줬다.

*중요 아직 완성되지 않은 코드..!
여기서 추후에 myOrders리스트에 추가되어있는 물품들, 즉 장바구니에 담겨져있는 물품들을 구매할 수 있게 할건데, 만약 그때 구매물품들의 가격이 10,000원이면 남은돈은 10,000원이 남게된다. 그 사용자가 추가로 물품을 구매하려면 남은 10,000원으로 추가쇼핑을 해야하는데, addOrder함수 내에서 myMoney를 20,000원으로 초기화해둬서 다시 돈이 20,000원으로 초기화된다.. 이는 내일 고쳐볼 예정이다.!

여기까지가 오늘 해본 키오스크 프로그래밍이였다. 오랜만에 정말 집중했던거같다. 단계별로, 문제가 원하는대로 잘 했는지는 모르겠지만.. 모든 기능을 구현할때까지 이번주 열심히 해볼 예정이다! 화이팅💪💪

profile
이우진

0개의 댓글