본문 바로가기

카테고리 없음

23.12.12 키오스크 2

어제에 이어서 오늘은 클래스를 만들고, 그 클래스들이 작동해서 메뉴를 가동시키고 메인파일은 중계만 하도록 만들어 본다!

 

버거메뉴 클래스 파일을 이렇게 만든다.

class BurgerMenu {
    companion object {
        val menuItems = arrayOf(
            "와퍼         | W 8.0 | 불에 직접 구운 순 쇠고기 패티에 싱싱한 야채가 한가득~ 버거킹의 대표 메뉴!",
            "불고기와퍼    | W 8.0 | 불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 달콤한 불고기 소스까지!",
            "치즈와퍼      | W 8.6 | 불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 고소한 치즈까지!",
            "통새우와퍼    | W 8.8 | 불맛 가득 순쇠고기, 갈릭페퍼 통새우, 스파이시토마토소스가 더해진 프리미엄 버거!",
        )
    }

    fun showMenu() {
        println("[ Burgers MENU ]")
        menuItems.forEachIndexed { index, menu ->
            println("${index + 1}. $menu")
        }
        println("0. 뒤로가기")
    }
}

 

음료도

class DrinkMenu {
    companion object {
        val menuItems = arrayOf(
            "콜라           | W 2.9 | 코카-콜라로 더 짜릿하게!",
            "사이다         | W 2.9 | 나를 깨우는 상쾌함!",
            "아메리카노      | W 2.4 | 자연을 담은 버거킹 RA인증커피"
        )
    }

    fun showMenu() {
        println("[ Drink MENU ]")
        menuItems.forEachIndexed { index, menu ->
            println("${index + 1}. $menu")
        }
        println("0. 뒤로가기")
    }
}

 

메인 파일은

fun main() {
    println("========================================")
    println("   버거킹에 오신걸 환영 합니다!  ")
    println("========================================")

    val burgerMenu = BurgerMenu()
    val drinkMenu = DrinkMenu()

    while (true) {
        try {
            println("메뉴를 선택하세요:")
            println("1. 버거")
            println("2. 음료")
            println("3. 종료")
            print(" ---> ")

            val input = readLine()!!.toInt()

            when (input) {
                1 -> {
                    burgerMenu.showMenu()

                    val burgerInput = readLine()!!.toInt()

                    when (burgerInput) {
                        0 -> {
                        }
                        in 1..BurgerMenu.menuItems.size -> {
                            println("선택한 버거: ${BurgerMenu.menuItems[burgerInput - 1]}")
                        }
                        else -> {
                            println("올바른 번호를 입력하세요.")
                        }
                    }
                }
                2 -> {
                    drinkMenu.showMenu()

                    val drinkInput = readLine()!!.toInt()

                    when (drinkInput) {
                        0 -> {
                        }
                        in 1..DrinkMenu.menuItems.size -> {
                            println("선택한 음료: ${DrinkMenu.menuItems[drinkInput - 1]}")
                        }
                        else -> {
                            println("올바른 번호를 입력하세요.")
                        }
                    }
                }
                3 -> {
                    println("프로그램을 종료합니다.")
                    break
                }
                else -> {
                    println("1, 2, 3 중에서 선택하세요.")
                }
            }
        } catch (e: NumberFormatException) {
            println("올바른 숫자를 입력하세요.")
        }
    }
}

그러면 1번을 누르면  burgerMenu.showMenu()로 인해 클래스 버거메뉴로 넘어가고 그 내부에서 숫자를 누르면

in 1..BurgerMenu.menuItems.size -> {
                            println("선택한 버거: ${BurgerMenu.menuItems[burgerInput - 1]}") 이걸로 역시 클래스 내부의 버거들을 선택해서 선택한버거: 버거이름이 나오는 것이다.

음료도 동일하게 작동한다.

 

그런데 다시보니 클래스를 name: String, price: Int, displayInfo(): Unit을 써야하는데 쓰지 않아서 다시 변경해야 했다.

 

메뉴아이템이라는 새 파일을 만들고

interface MenuItem {
    val name: String
    val price: Int
    val description: String
    fun displayInfo()
}

 

이것을 통해 클래스에 name: String, price: Int, displayInfo():를 넣는다.

그로고 다른 클래스들도 변형시키고, 저 셋의 추가로 동시에 이름, 가격 설명을 따로 출력할수 있게 됬으니

class Drink(
    override val name: String,
    override val price: Int,
    override val description: String
) : MenuItem {
    override fun displayInfo() {
        println("음료 이름: $name")
        println("가격: $price 원")
        println("설명: $description")
    }
}

 

이렇게 인터페이스와 음료를 엮어서 출력할수 있게 만든다. 버거도 동일하다.

class Burger(
    override val name: String,
    override val price: Int,
    override val description: String
) : MenuItem {
    override fun displayInfo() {
        println("버거 이름: $name")
        println("가격: $price 원")
        println("설명: $description")
    }
}

이렇게 버거메뉴를 버거 클래스로 메뉴아이템과 연결시키고 

class BurgerMenu {
    val menuItems = arrayOf(
        Burger("와퍼", 8000, "불에 직접 구운 순 쇠고기 패티에 싱싱한 야채가 한가득~ 버거킹의 대표 메뉴!"),
        Burger("불고기와퍼", 8000, "불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 달콤한 불고기 소스까지!"),
        Burger("치즈와퍼", 8600, "불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 고소한 치즈까지!"),
        Burger("통새우와퍼", 8800, "불맛 가득 순쇠고기, 갈릭페퍼 통새우, 스파이시토마토소스가 더해진 프리미엄 버거!")
    )

    fun showMenu() {
        println("[ Burgers MENU ]")
        menuItems.forEachIndexed { index, menuItem ->
            println("${index + 1}. ${menuItem.name}")
        }
        println("0. 뒤로가기")
    }
}

val menuItems = arrayOf( 덕분에 메뉴 아이템과 연결되서 이름,가격,설명이 각각 출력 되도록 한다.

 

참고로 메인은

fun main() {
    println("========================================")
    println("   버거킹에 오신걸 환영 합니다!  ")
    println("========================================")

    val burgerMenu = BurgerMenu()
    val drinkMenu = DrinkMenu()

    while (true) {
        try {
            println("메뉴를 선택하세요:")
            println("1. 버거")
            println("2. 음료")
            println("3. 종료")
            print(" ---> ")

            val input = readLine()!!.toInt()

            when (input) {
                1 -> {
                    burgerMenu.showMenu()

                    val burgerInput = readLine()!!.toInt()

                    when (burgerInput) {
                        0 -> {
                            // 이전 화면으로 돌아가기
                        }
                        in 1..burgerMenu.menuItems.size -> {
                            burgerMenu.menuItems[burgerInput - 1].displayInfo()
                        }
                        else -> {
                            println("올바른 번호를 입력하세요.")
                        }
                    }
                }
                2 -> {
                    drinkMenu.showMenu()

                    val drinkInput = readLine()!!.toInt()

                    when (drinkInput) {
                        0 -> {
                            // 이전 화면으로 돌아가기
                        }
                        in 1..drinkMenu.menuItems.size -> {
                            drinkMenu.menuItems[drinkInput - 1].displayInfo()
                        }
                        else -> {
                            println("올바른 번호를 입력하세요.")
                        }
                    }
                }
                3 -> {
                    println("프로그램을 종료합니다.")
                    break
                }
                else -> {
                    println("1, 2, 3 중에서 선택하세요.")
                }
            }
        } catch (e: NumberFormatException) {
            println("올바른 숫자를 입력하세요.")
        }
    }
}

근데 만들고 나니 메뉴를 표시할때 가격과 설명이 나오지 않고 메뉴를 고른 뒤에야 가격이 나오지 않는가! 그래선 메뉴라 부를수 없으니 수정해 보았다.

fun showMenu() {
    println("[ Burgers MENU ]")
    menuItems.forEachIndexed { index, menuItem ->
        println("${index + 1}. ${menuItem.name} | 가격: ${menuItem.price} 원 | 설명: ${menuItem.description}")
    }
    println("0. 뒤로가기")
    print(" ---> ")
}

이걸 음료에도 똑같이 적용해 보았다. 그리고--->도 추가해 숫자를 입력할 칸도 추가했다. 물론 숫자는 아무데나 입력해도 작동하지만...

 

그리고 이제 이것들을 하나의 객체 list로 정리하라는데, 여러개로 나뉜 클래스들을 합치라는 것인가? 기껏 나눈걸 합치다니! 이건 아무래도 다음에 이어서 해야겠다.