본문 바로가기
TIL

TIL - 23.12.12

by JHBang 2023. 12. 12.

오늘부터 이번주 주어진 과제를 작성하기로 했다.

아래는 과제 내용이다.

 

Kotlin 문법 과제 - 키오스크 프로그래밍

💡 Goal : 키오스크 프로그래밍

  • 지금까지 배운 Kotlin 기초/심화 문법을 응용해서 키오스크 프로그래밍 과제를 완성해 봅시다
  • 팀원들과 적절한 업무 분담을 위해서 서로를 소개하고 팀노션을 만드는 것 부터 시작해주세요~!

 📌 Requirement : 과제에 요구되는 사항이에요.

 

lv0 ~lv3 는 팀원들의 학습 성취도에 따라 논의를 통해 업무를 분담해 보세요. 업무 분담이 어렵다면 튜터님과 함께 풀어나가봅시다. 차례차례 구현해서 키오스크 프로그래밍을 완성하는 것이 이번주 목표입니다.

완성하셨다면 lv4, 5도 도전해보세요!

 

 

lv0~3은 키오스크의 기본 골자를 만드는 과정이고, lv4~5는 기능읗 넣는 과정이다.

일단 오늘은 키오스크의 기본 골자를 어느정도 만들어놨다.

 

 

일단 구성한 클래스들이다.

각 메뉴의 상세 메뉴판을 구성했고 인터페이스를 이용해 각 메뉴를 띄운다.

 

fun main() {
    val mainScreen = MainScreen()
    val menuPrint = MenuControl()
    var choosednum = 1
    while(true) {
        mainScreen.screenPrint()
        choosednum = menuPrint.menuSelect(mainScreen.userChoice)
        if(choosednum == 9) continue
        else break
    }
}

메인 함수이다. 필요한 클래스들을 인스턴스화 하고 무한루프로 기본 메뉴판을 출력한다.

 

class MainScreen {
    var userChoice = 0
    fun screenPrint(){
        while(true) {
            println("\n\n\n\n\n")
            println("[ McDonald's Menu ]")
            println("1. Burger")
            println("2. Happy Snack")
            println("3. Sides & Desserts")
            println("4. McCafe & Beverages\n")
            println("0. Exit")
            println("===================")
            try {
                userChoice = readln().toInt()
                if(userChoice < 0 || userChoice > 4){
                    println("목록에 없는 선택 입니다.")
                    continue
                }
                else break
            } catch (e: NumberFormatException) {
                println("잘못된 형식입니다.")
                continue
            }
        }
    }
}

MainScreen 클래스이다. 상세 메뉴로 들어가기 전 카테고리를 선택할 수 있다. 예외처리를 통해 intager형만 받을 수 있도록 한다.

 

class MenuControl {
    private lateinit var choosedMenu: MenuInterface
    fun menuSelect(x: Int): Int {
        when (x) {
            1 -> choosedMenu = BurgerMenu()
            2 -> choosedMenu = HappySnackMenu()
            3 -> choosedMenu = SIdeMenu()
            4 -> choosedMenu = CafeMenu()
        }
        return choosedMenu.printMenu()
    }
}
interface MenuInterface {
    fun printMenu(): Int
}

MenuControl 클래스는 인터페이스인 MenuInterface를 지연 초기화 하고 사용자가 입력한 숫자에 따라 인터페이스를 초기화한다.

 

class BurgerMenu: MenuInterface {
    private var choice = 0
    val burgerList: MutableList<MenuInfo> = mutableListOf(
        MenuInfo("Big Mac®", 1, 5.5, false),
        MenuInfo("Big Mac® - Meal", 1, 6.9, true),
        MenuInfo("McSpicy Shanghai Burger", 2, 5.5, false),
        MenuInfo("McSpicy Shanghai Burger - Meal", 2, 6.9, true),
        MenuInfo("1955 Burger", 3, 6.4, false),
        MenuInfo("1955 Burger - Meal", 3, 7.8, true),
        MenuInfo("Bacon Tomato Deluxe", 4, 5.8, false),
        MenuInfo("Bacon Tomato Deluxe - Meal", 4, 7.7, true),
        MenuInfo("Bulgogi Burger", 5, 3.1, false),
        MenuInfo("Bulgogi Burger - Meal", 5, 4.9, true),
        MenuInfo("Cheeseburger", 6, 2.7, false),
        MenuInfo("Cheeseburger - Meal", 6, 4.7, true))
    override fun printMenu(): Int {
        while(true) {
            println("\n\n\n\n\n")
            println("             [ Burger Menu ]             ")
            println("                        burger   Meal")
            for (menu in burgerList){
                if(menu.option == false) menu.displayInfo()
                else println("  /  ${menu.price}₩")
            }
            println("9. Home    0. Exit")
            println("======================================")
            try {
                choice = readln().toInt()
                if(choice in 7..8 || choice < 0 || choice > 9){
                    println("목록에 없는 선택 입니다.")
                    continue
                }
                else break
            } catch (e: NumberFormatException) {
                println("숫자로 입력하세요.")
                continue
            }
        }
        return choice
    }
}
class MenuInfo(val name: String, val number: Int, val price: Double, val option: Boolean) {
    fun displayInfo(){
        println("$number. $name")
        print("                        $price₩")
    }
}

대표로 BurgerMenu 클래스를 보면  burgerList라는 리스트 안에 MenuInfo클래스를 넣는 작업을 수행한다.

이 리스트는 메뉴 정보를 담고 있으며 아래에서 for문을 통해 메뉴를 출력한다.

실행한 모습

option이 false일 경우 단품, true일 경우 세트로 구성했다. 이 option 프로퍼티는 후에 커피의 아이스/핫의 구분에도 도움을 줄 것으로 기대한다.

'TIL' 카테고리의 다른 글

TIL - 23.12.26  (1) 2023.12.26
TIL - 23.12.20  (1) 2023.12.20
TIL - 23.12.19  (1) 2023.12.19
TIL - 23.12.18  (0) 2023.12.18
TIL - 23.12.14  (0) 2023.12.15