Weekly I Learned

23년 7월 24일 ~28일 WIL- 키오스크 서비스

jjjkh 2023. 7. 30. 23:41

이번주에는 swift 기본 문법을 공부해보면서 터미널을 이용한 키오스크 서비스를 만들어보았다. 많은 기능이 있는 것은 아니지만 여러가지 기능을 구현해 보는것 보다는 더 깔끔한 코드를 적어보려고 공식 문서의 문법을 찾아보며 많은 공부가 되었다고 생각이 든다.

키오스크 서비스

위 터미널과 같이 메뉴를 선택하면 세부 메뉴를 선택할수 있는 간단한 서비스를 만들어 보았다. 

처음에 작성한 코드는 for문과 swich문을 사용해서 코드의 길이가 길고 메뉴가 추가된다면 변경 사항들이 많다는 단점이 있었다. 그래서 최대한 코드를 간결하고 변경사항이 있다면 수정을 최소화할 수 있는 방법을 생각해 보았다. 클로저와 배열을 사용하는 방법이였다. 

 

swich문에 각각의 데이터를 넣어주는 방법

// 처음 for문과 swich문을 사용한 코드

import Foundation

func Menu() {
    let a = [1, 2, 3, 4, 0]
    while true {
        print("[ SHAKESHACK MENU ]")
        for i in a {
            switch i {
            case 1:
                print("1. Bugers         |앵거스 브프 통살을 다져만든 버거")
            case 2:
                print("2. FrozenCustard  |매장에서 신선하게 만드는 아이스크림")
            case 3:
                print("3. Drink          |매장에서 직접 만드는 음료")
            case 4:
                print("4. Beer           |뉴욕 브루클린 브루어리에서 양조한 맥주")

            default:
                print("0. 종료             |프로그램 종료")
            }
        }
        guard let mainRead = readLine() else { continue }

        if mainRead == "1" {
            print("1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거")
            print("2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거")
            print("3. Shroom Burger | W 9.4 | 몬스터 치즈와 체다 치즈로 속을 채운 베지테리안 버거")
            print("4. Hamburger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거")

            guard let detailRead = readLine() else { continue }

            switch detailRead {
            case "1":
                print("ShackBurger 버거를 선택하셨습니다.")
            case "2":
                print("SmokeShack 버거를 선택하셨습니다.")
            case "3":
                print("Shroom Burger 버거를 선택하셨습니다.")
            case "4":
                print("Hamburger 버거를 선택하셨습니다.")
            default:
                return
            }
        }
        else if mainRead == "2" {
            print("1. Chocolate Frozen Custard    | W 8.9 | 초콜릿맛 Chocolate Frozen Custard")
            print("2. Vanila Frozen Custard       | W 6.9 | 바닐라맛 Vanila Frozen Custard")

            guard let detailRead = readLine() else { continue }

            switch detailRead {
            case "1":
                print("Chocolate Frozen Custard 아이스크림을 선택하셨습니다.")
            case "2":
                print("Vanila Frozen Custard 아이스크림을 선택하셨습니다.")

            default:
                return
            }
        }
        else if mainRead == "3" {
            print("1. Cider   | W 6.9 | 사이다")
            print("2. Cola    | W 6.9 | 코카콜라")
            guard let detailRead = readLine() else { continue }
            switch detailRead {
            case "1":
                print("Cider 음료를 선택하셨습니다.")
            case "2":
                print("Cola 음료를 선택하셨습니다.")

            default:
                return
            }
        }
        else if mainRead == "4" {
            print("1. Beer       | W 6.9 | 뉴욕 브루클린 브루어리에서 양조한 맥주")
            print("2. BrownAle   | W 6.9 | 상큼한 브라운 에일")
            guard let detailRead = readLine() else { continue }
            switch detailRead {
            case "1":
                print("Beer 맥주를 선택하셨습니다.")
            case "2":
                print("BrownAle 맥주를 선택하셨습니다.")

            default:
                return
            }
        }
        else if mainRead == "0" {
            print("0. 종료   | 프로그램 종료")
            return
        }
    }
}

func DetailMenu() {}

Menu()

클로저와 배열을 이용한 데이터를 활용하는 방법

// 클로저와 배열을 이용한 데이터를 활용하는 방법

import Foundation
// 처음 메뉴를 구성하는 리스트

var Burgers = (id: 1, name: "Buger", desc: "앵거스 비프 통살을 다져만든 버거")
var FrozenCustard = (id: 2, name: "FrozenCustard", desc: "매장에서 신선하게 만드는 아이스크림")
var Drink = (id: 3, name: "Drink", desc: "매장에서 직접 만드는 음료")
var Beer = (id: 4, name: "Beer", desc: "뉴욕 브루클린 브루어리에서 양조한 맥주")

var Menus = [Burgers, FrozenCustard, Drink, Beer]

func Menu() {
    while true {
        print("[ SHAKESHACK MENU ]")
        for menu in Menus {
            print("\(menu.id). \(menu.name.padding(toLength: 20, withPad: " ", startingAt: 0))| \(menu.desc)")
        }
        guard let mainRead = readLine(), let num = Int(mainRead) else { continue }
        return Detail(num: num)
    }
}

// 상세 버거
var ShackBurger = (id: 1, name: "ShackBurger", price: 6.9, desc: "토마토, 양상추, 쉑소스가 토핑된 치즈버거")
var SmokeShack = (id: 2, name: "SmokeShack", price: 8.9, desc: "베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거")

// 상세 아이스크림
var Chocolate = (id: 1, name: "Chocolate Frozen Custard ", price: 8.9, desc: "초콜릿맛")
var Vanila = (id: 2, name: "Vanila Frozen Custard", price: 6.9, desc: "바닐라맛")

// 상세 음료
var Cider = (id: 1, name: "Cider ", price: 6.9, desc: "사이다")
var Cola = (id: 2, name: "Cola", price: 6.9, "코카콜라")

// 상세 맥주
var Lager = (id: 1, name: "Lager ", price: 4.5, "브루클린 라거")
var BrownAle = (id: 2, name: "BrownAle", price: 4.5, "상큼한 브라운 에일")

var SelectBurger: [(id: Int, name: String, price: Double, desc: String)] = [ShackBurger, SmokeShack]
var SelectFrozen: [(id: Int, name: String, price: Double, desc: String)] = [Chocolate, Vanila]
var SelectDrink: [(id: Int, name: String, price: Double, desc: String)] = [Cider, Cola]
var SelectBeer: [(id: Int, name: String, price: Double, desc: String)] = [Lager, BrownAle]

var choice: [[(id: Int, name: String, price: Double, desc: String)]] = [SelectBurger, SelectFrozen, SelectDrink, SelectBeer]

func Detail(num: Int) {
    while true {
        let select = choice[num - 1]
        for detail in select {
            print(" \(detail.id). \(detail.name.padding(toLength: 20, withPad: " ", startingAt: 0))| \(detail.price) | \(detail.desc)")
        }

        guard let detailRead = readLine(), let fin = Int(detailRead) else { continue }
        let eat = select[fin - 1]
        print("\(eat.name)를 골랐습니다.")
        return Menu()
    }
}

Menu()

 

위의 코드를 보면 swich를 이용한 코드가 더욱 길고 수정이 번거로운 점을 확인할 수 있다. 이러한 문제로 인해 키오스크 서비스의 기능적인 추가보다는 더 간단한 코드와 수정이 편리한 로직으로 서비스를 만들어 보기 위해 메뉴에 대한 데이터를 클로저와 배열을 이용하여 작성해보았다. 우선 클로저를 이용하여 각 데이터를 관리하고 클로저들을 배열에 넣어주어 메뉴 항목을 구성하는 방식이다. 아직 완벽하게 코드를 간단하고 수정이 편한 방식은 아니지만 이렇게 다른 방법으로 생각해보고 공부해보니 이번주에는 문법에 대한 이해도가 앞으로 중요하게 작용될 것 같다고 생각이 들었다. 앞으로도 문법공부를 꾸준히 해야겠다.