안드로이드와 앱/프로젝트

개인 프로젝트 [콘솔형 키오스크]

정혜현 2024. 6. 11. 10:22

Lv0 계획

시작 전 어떻게 구현할 것인지에 그려 보는 과정

 

무엇을?

카페메뉴 키오스크 만들기

대분류 : 1. 음료 2. 디저트 3. 상품  

 

중분류 :

음료 1.1 커피 1.2 Non커피

디저트 2.1 타르트 2.2 케이크

상품 3.1

 

소분류 :

음료(커피) 1.1.1아메리카노 1.1.2카페라떼 1.1.3카페모카 1.1.4카라멜 마키아또

음료(Non커피) 1.2.1말차라떼 1.2.2밀크티 1.2.3망고스무디 1.2.4자몽에이드(나중에 자몽티로 변경됐다.)

디저트(브레드) 2.1.1에그타르트 2.2.2피칸타르트 2.2.3애플시나몬타르트 2.2.4딸기타르트

디저트(케이크) 2.2.1티라미수 2.2.2치즈케이크 2.2.3갸또쇼콜라 2.2.4얼그레이케이크

상품 3.1.1머그 3.1.2 텀블러

(상품도 더 많았는데 줄였다.)

 

어떻게?

기능

분류별 메뉴 보여주기(대분류-중분류-소분류별)

번호 입력받기

입력받은 번호와 일치하는 곳으로 이동하기 : 조건문 사용

모든 메뉴에 종료 및 뒤로가기 버튼 포함(뒤로가기는 처음으로 가는 버튼으로 변경됐다.)

 

 

 

 


 

 

 

Lv1 메뉴판

조건 : 프로그램 실행시 메뉴판의 번호 보여주기.(대분류의 메뉴를 보여줌)

 

음료(커피)

1.1.1아메리카노

1.1.2카페라떼

1.1.3카페모카

1.1.4카라멜 마키아또

음료(Non커피)

1.2.1말차라떼

1.2.2밀크티

1.2.3망고스무디

1.2.4자몽에이드  

디저트(타르트)

2.1.1 에그타르트 

2.2.2 피칸타르트 

2.2.3 애플시나몬타르트 

2.2.4 딸기타르트

디저트(케이크)

2.2.1 티라미수

2.2.2 치즈케이크

2.2.3 갸또쇼콜라 

2.2.4 얼그레이케이크

상품

3.1.1머그 3.1.2 텀블러

 

맨처음 코드. 반복을 여기저기 넣어보고 여러 시도를 거쳐도 뒤로가기가 도저히 안돼서 시도한 건 지우고 반복문은 순차적으로만 작성했다. 튜터님께 자문을 구했더니 함수로 구현해보는 방법도 설명해주셨다. 

fun main(){
    var userChoice : Int = 0
    var drink : Int = 0
    var dessert : Int = 0
    var order : Int = 0


    while(true){
        //메뉴_대분류
        println("어서오세요-! 원하시는 번호를 입력해주세요.")
        println("1. 음료 2. 디저트 3. 상품 0. 종료")
        userChoice = readLine()!!.toInt()

            //메뉴_중분류
            when (userChoice) {
                1 -> {
                    println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                    println("1. 커피 2. 커피가 아닌 음료 9. 뒤로가기 0. 종료")
                    drink = readLine()!!.toInt()
                }

                2 -> {
                    println("어떤 디저트를 원하실까요? 번호를 입력해주세요.")
                    println("1. 타르트 2. 케이크 9. 뒤로가기 0. 종료")
                    dessert = readLine()!!.toInt()
                }

                3 -> {
                    println("어떤 상품을 원하실까요? 번호를 입력해주세요.")
                    println("1. 머그컵 2. 텀블러 9. 뒤로가기 0. 종료")
                    order = readLine()!!.toInt()
                }

                0 -> {
                    println("감사합니다. 또 오세요-!")
                    break
                }
            }

            //메뉴_소분류
            //음료
            if (userChoice == 1) {
//                while(true) {
                    when (drink) {
                        1 -> {
                            println("어떤 커피를 원하실까요? 번호를 입력해주세요.")
                            println("1. 아메리카노 2. 카페라떼 3. 카페모카 4. 카라멜 마키아또 9. 뒤로가기 0. 종료")
                            order = readLine()!!.toInt()
                        }

                        2 -> {
                            println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                            println("1. 말차라떼 2. 밀크티 3. 망고스무디 4. 자몽에이드 9. 뒤로가기 0. 종료")
                            order = readLine()!!.toInt()
                        }

                        0 -> {
                            println("감사합니다. 또 오세요-!")
                            break
                        }
                    }
            }


            //디저트
            else if (userChoice == 2) {
                when (dessert) {
                    1 -> {
                        println("어떤 타르트를 원하실까요? 번호를 입력해주세요.")
                        println("1. 에그타르트 2. 피칸타르트 3. 애플시나몬타르트 4. 딸기타르트 9. 뒤로가기 0. 종료")
                        order = readLine()!!.toInt()
                    }

                    2 -> {
                        println("어떤 케이크를 원하실까요? 번호를 입력해주세요.")
                        println("1. 티라미수 2. 치즈케이크 3. 갸또쇼콜라 4. 얼그레이케이크 9. 뒤로가기 0. 종료")
                        order = readLine()!!.toInt()
                    }

                    0 -> {
                        println("감사합니다. 또 오세요-!")
                        break
                    }
                }
            }
            //상품
            else if (userChoice == 3) {
                if (order == 1) {
                    println("머그컵 준비해드리겠니다. 감사합니다-!")}
                else println("텀블러 준비해드리겠니다. 감사합니다-!")
            }

            else if (userChoice == 0) {
                println("감사합니다. 또 오세요-!")
                break
            }



        //주문완료!
        when{
            (drink == 1 && order ==1) -> {println("아메리카노로 준비해드리겠니다. 감사합니다-!")}
            (drink == 1 && order ==2) -> {println("카페라떼로 준비해드리겠니다. 감사합니다-!")}
            (drink == 1 && order ==3) -> {println("카페모카로 준비해드리겠니다. 감사합니다-!")}
            (drink == 1 && order ==4) -> {println("카라멜 마키아또로 준비해드리겠니다. 감사합니다-!")}
            (drink == 2 && order ==1) -> {println("말차라떼로 준비해드리겠니다. 감사합니다-!")}
            (drink == 2 && order ==2) -> {println("밀크티로 준비해드리겠니다. 감사합니다-!")}
            (drink == 2 && order ==3) -> {println("망고스무디로 준비해드리겠니다. 감사합니다-!")}
            (drink == 2 && order ==4) -> {println("자몽에이드로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 1 && order ==1) -> {println("에그타르트로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 1 && order ==2) -> {println("피칸타르트로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 1 && order ==3) -> {println("애플시나몬타르트로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 1 && order ==4) -> {println("딸기타르트로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 2 && order ==1) -> {println("티라미수로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 2 && order ==2) -> {println("치즈케이크로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 2 && order ==3) -> {println("갸또쇼콜라로 준비해드리겠니다. 감사합니다-!")}
            (dessert == 2 && order ==4) -> {println("얼그레이케이크로 준비해드리겠니다. 감사합니다-!")}
            (order==0) -> {println("감사합니다. 또 오세요-!")
                            break}
            else -> {println("감사합니다. 또 오세요-!")
                    break}
            }

    //while
    }
//main
}

 

변경된 사항 : 조건문을 중첩으로 바꿨다. 

혼자 할 땐 중첩이 안됐는데 알고보니 위치를 잘못 선정해서 그렇다. 중첩으로 바꾸니 가독성과 코드 길이가 개선됐다. 뒤로가기는 안되고 처음으로 가기만 돼서 튜터님께 다시 여쭤보니 해설에도 뒤로가는 기능 없어서 빼기로 했다. 그 덕에 조건문when에서 조건에 {} 아무것도 적지 않으면 조건문을 빠져나가 다시 반복문 시작으로 돌아가는 걸 배웠다. 

 

fun main(){
    var userChoice : Int = 0
    var drink : Int = 0
    var dessert : Int = 0
    var order : Int = 0

    while(true){
        //시작
        println("어서오세요-! 원하시는 번호를 입력해주세요.")
        println("1. 음료 2. 디저트 3. 상품 0. 종료")
        userChoice = readLine()!!.toInt()

            //메뉴
            when (userChoice) {
                1 -> {
                    println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                    println("1. 커피 2. 커피가 아닌 음료 9. 뒤로가기 0. 종료")
                    drink = readLine()!!.toInt()
                    when (drink) {
                        1 -> {
                            println("어떤 커피를 원하실까요? 번호를 입력해주세요.")
                            println("1. 아메리카노 2. 카페라떼 3. 카페모카 4. 카라멜 마키아또 9. 처음으로 0. 종료")
                            order = readLine()!!.toInt()
                            when(order) {
                                1 -> println("아메리카노로 준비해드리겠습니다. 감사합니다-!")
                                2 -> println("카페라떼로 준비해드리겠습니다. 감사합니다-!")
                                3 -> println("카페모카로 준비해드리겠습니다. 감사합니다-!")
                                4 -> println("카라멜 마키아또로 준비해드리겠습니다. 감사합니다-!")
                            }
                        }
                        2 -> {
                            println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                            println("1. 말차라떼 2. 밀크티 3. 망고스무디 4. 자몽에이드 9. 처음으로 0. 종료")
                            order = readLine()!!.toInt()
                            when(order) {
                                1 -> println("말차라떼로 준비해드리겠습니다. 감사합니다-!")
                                2 -> println("밀크티로 준비해드리겠습니다. 감사합니다-!")
                                3 -> println("망고스무디로 준비해드리겠습니다. 감사합니다-!")
                                4 -> println("자몽에이드로 준비해드리겠습니다. 감사합니다-!")
                            }
                        }
                        9 -> {}
                        0 -> {
                            println("감사합니다. 또 오세요-!")
                            break
                            }
                        }
                    }
                2 -> {
                    println("어떤 디저트를 원하실까요? 번호를 입력해주세요.")
                    println("1. 타르트 2. 케이크 9. 뒤로가기 0. 종료")
                    dessert = readLine()!!.toInt()
                    when (dessert) {
                        1 -> {
                        println("어떤 타르트를 원하실까요? 번호를 입력해주세요.")
                        println("1. 에그타르트 2. 피칸타르트 3. 애플시나몬타르트 4. 딸기타르트 9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                            when(order) {
                                1 -> println("에그타르트로 준비해드리겠습니다. 감사합니다-!")
                                2 -> println("피칸타르트로 준비해드리겠습니다. 감사합니다-!")
                                3 -> println("애플시나몬타르트로 준비해드리겠습니다. 감사합니다-!")
                                4 -> println("딸기타르트로 준비해드리겠습니다. 감사합니다-!")
                            }
                        }
                        2 -> {
                        println("어떤 케이크를 원하실까요? 번호를 입력해주세요.")
                        println("1. 티라미수 2. 치즈케이크 3. 갸또쇼콜라 4. 얼그레이케이크 9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                            when(order) {
                                1 -> println("티라미수로 준비해드리겠습니다. 감사합니다-!")
                                2 -> println("치즈케이크로 준비해드리겠습니다. 감사합니다-!")
                                3 -> println("갸또쇼콜라로 준비해드리겠습니다. 감사합니다-!")
                                4 -> println("얼그레이케이크로 준비해드리겠습니다. 감사합니다-!")
                            }
                        }
                        0 -> {
                        println("감사합니다. 또 오세요-!")
                        break
                            }
                        }
                    }
                3 -> {
                    println("어떤 상품을 원하실까요? 번호를 입력해주세요.")
                    println("1. 머그컵 2. 텀블러 9. 처음으로 0. 종료")
                    order = readLine()!!.toInt()
                        if (order == 1) {
                        println("머그컵 준비해드리겠습니다. 감사합니다-!")}
                        else println("텀블러 준비해드리겠습니다. 감사합니다-!")
                    }
                9 -> {}
                0 -> {
                    println("감사합니다. 또 오세요-!")
                    break
                    }
                }
    //while
    }

 

 

 


 

Lv2 클래스

조건 : 프로퍼티와 메소드를 작성하여 클래스 설계

 

 

class CafeMenu {
    var name : String = "카페메뉴"
    var price : Int = 0
    fun information(a:String) {
        println("메뉴 정보입니다.")}
}
class Drink {
    var name : String = "음료"
    var price : Int = 0
    var temperature : String = "ice"
    fun information(a:String) {
        println("음료 정보입니다.")}
}
class Coffee {
    var name : String = "커피"
    var price : Int = 100
    var temperature : String = "hot"
    fun information(a:String) {
        println("커피 정보입니다.")}
}
class NonCoffee {
    var name : String = "주스"
    var price : Int = 200
    var temperature : String = "ice"
    fun information(a:String) {
        println("커피가 아닌 음료 정보입니다.")}
}
class Dessert {
    var name : String = "디저트"
    var price : Int = 0
    fun gift(a:String) {
        println("선물포장 가능합니다.")}
    fun information(a:String) {
        println("디저트 정보입니다.")}
}
class Tart {
    var name : String = "타르트"
    var price : Int = 300
    fun gift(a:String) {
        println("선물포장 가능합니다.")}
    fun information(a:String) {
        println("타르트 정보입니다.")}
}
class Cake {
    var name : String = "케이크"
    var price : Int = 500
    fun gift(a:String) {
        println("선물포장 가능합니다.")}
    fun information(a:String) {
        println("케이크 정보입니다.")}
}
class Product {
    var name : String = "상품"
    var price : Int = 0
    fun gift(a:String) {
        println("선물포장 가능합니다.")}
    fun information(a:String) {
        println("상품 정보입니다.")}
}

 

 


 

Lv3 상속과 리스트

조건 : 클래스간 관계 설정, 리스트로 메뉴 관리, 메뉴들을 객체화하고 리스트에 담기

 

 

레벨 2에서 만든 클래스들을 모두 살리긴 했는데 모두 오버라이딩하진 않아서 이대로 두는 게 맞는지 의문이었다. 레벨3의 초기클래스는 이러했다.

fun main(){

//조부모 클래스
open class CafeMenu(name:String, price:Int) {
open var name = name
open var price = price
open fun information(){
println("${name} : ${price}원")
}
}

//부모 클래스_음료
open class Drink(name:String, price:Int, temperature:String) : CafeMenu(name,price) {
override var name = name
override var price = price
open var temperature = temperature
override fun information() {
println("${name}(${temperature}) : ${price}원")
}
}
//자식 클래스_커피
class Coffee(name:String, price:Int, temperature:String) : Drink(name,price,temperature) {
override var name = name
override var price = price
override var temperature = temperature
override fun information() {
println("${name}(${temperature}) : ${price}원")
}
}
class NonCoffee(name:String, price:Int, temperature:String) : Drink(name,price,temperature) {
override var name = name
override var price = price
override var temperature = temperature
override fun information() {
println("${name}(${temperature}) : ${price}원")
}
}



//부모 클래스_디저트
open class Dessert(name:String, price:Int) : CafeMenu(name,price) {
override var name = name
override var price = price
open fun gift() {
print("예쁘게 포장된 ")
}
override fun information() {
println("${name} : ${price}원")
}
}
//자식 클래스_디저트
class Tart(name:String, price:Int) : Dessert(name,price) {
override var name = name
override var price = price
override fun gift() {
print("예쁘게 포장된 ")
}
override fun information() {
println("${name} : ${price}원")
}
}
class Cake(name:String, price:Int) : Dessert(name,price) {
override var name = name
override var price = price
override fun gift() {
print("예쁘게 포장된 ")
}
override fun information() {
println("${name} : ${price}원")
}
}

//자식 클래스_상품
class Product(name:String, price:Int) : CafeMenu(name,price) {
override var name = name
override var price = price
fun present(){
print("(+에그 타르트 증정)")
}
override fun information() {
println("${name} : ${price}원")
}
}

 

변경된 사항 : 안쓰는 자식 클래스들을 정리했고 오버라이딩도 수정했다.

 

클래스타입과 리스트에 담는 과정에서 가장 많은 시간을 쏟았다. 튜터님께 검토받았는데 오늘 본 것 중에 가장 잘했다고 칭찬해주셨다. 메뉴 설명하는 곳과 주문이 끝난 곳의 코드 중복을 줄이도록 피드백 받았다.

fun main(){

//부모 클래스
open class CafeMenu(name:String, price:Int) {
open var name = name
open var price = price
open fun information(){
println("${name} : ${price}원")
}
}
//자식 클래스_음료
open class Drink(name:String, price:Int, temperature:String) : CafeMenu(name,price) {
override var name = name
override var price = price
open var temperature = temperature
override fun information() {
println("${name}(${temperature}) : ${price}원")
}
}
//자식 클래스_디저트
open class Dessert(name:String, price:Int) : CafeMenu(name,price) {
override var name = name
override var price = price
open fun gift() {
print("예쁘게 포장된 ")
}
override fun information() {
println("${name} : ${price}원")
}
}
//자식 클래스_상품
class Product(name:String, price:Int) : CafeMenu(name,price) {
override var name = name
override var price = price
fun present(){
print("(+에그 타르트 증정)")
}
override fun information() {
println("${name} : ${price}원")
}
}

//변수선언
var userChoice : Int = 0
var userChoiceDrink : Int = 0
var userChoiceDessert : Int = 0
var order : Int = 0
var option : Int = 0

//인스턴스,리스트
var menuDrink = Drink("", 0, "")
var menuDrinkArrayList = ArrayList<Drink>()
var menuDessert = Dessert("",0)
var menuDessertArrayList = ArrayList<Dessert>()
var menuProduct = Product("",0)
var menuProductArrayList = ArrayList<Product>()

while(true){
//시작
println("어서오세요-! 원하시는 번호를 입력해주세요.")
println("1. 음료 2. 디저트 3. 상품 0. 종료")
userChoice = readLine()!!.toInt()

//메뉴
when (userChoice) {
1 -> {
println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
println("1. 커피 2. 커피가 아닌 음료 9. 뒤로가기 0. 종료")
userChoiceDrink = readLine()!!.toInt()
when (userChoiceDrink) {
1 -> {
println("어떤 커피를 원하실까요? 번호를 입력해주세요.")
menuDrink = Drink("아메리카노", 100, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("1. ")
menuDrinkArrayList[0].information()
menuDrink = Drink("카페라떼",150, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("2. ")
menuDrinkArrayList[1].information()
menuDrink = Drink("카페모카",200, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("3. ")
menuDrinkArrayList[2].information()
menuDrink = Drink("카라멜 마키아또",250, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("4. ")
menuDrinkArrayList[3].information()
println("9. 처음으로 0. 종료")
order = readLine()!!.toInt()

if (order != 9 && order != 0) {
println("ice를 원하시면 1을, hot을 원하시면 2를 입력해주세요.")
option = readLine()!!.toInt()
if (option == 1) menuDrinkArrayList[order - 1].temperature = "아이스"
else menuDrinkArrayList[order - 1].temperature = "핫"
}
else if(order == 0){
println("감사합니다. 또 오세요-!")
break
}
when (order) {
1 -> println("${menuDrinkArrayList[0].temperature} ${menuDrinkArrayList[0].name}로 준비해드리겠습니다. 감사합니다-!")
2 -> println("${menuDrinkArrayList[1].temperature} ${menuDrinkArrayList[1].name}로 준비해드리겠습니다. 감사합니다-!")
3 -> println("${menuDrinkArrayList[2].temperature} ${menuDrinkArrayList[2].name}로 준비해드리겠습니다. 감사합니다-!")
4 -> println("${menuDrinkArrayList[3].temperature} ${menuDrinkArrayList[3].name}로 준비해드리겠습니다. 감사합니다-!")
}
}
2 -> {
println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
menuDrink = Drink("말차라떼", 200, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("1. ")
menuDrinkArrayList[0].information()
menuDrink = Drink("밀크티",250, "ice/hot")
menuDrinkArrayList.add(menuDrink)
print("2. ")
menuDrinkArrayList[1].information()
menuDrink = Drink("망고스무디",300, "only ice")
menuDrinkArrayList.add(menuDrink)
print("3. ")
menuDrinkArrayList[2].information()
menuDrink = Drink("자몽티",350, "only hot")
menuDrinkArrayList.add(menuDrink)
print("4. ")
menuDrinkArrayList[3].information()
println("9. 처음으로 0. 종료")
order = readLine()!!.toInt()

when (order) {
1,2 -> {println("ice를 원하시면 1을, hot을 원하시면 2를 입력해주세요.")
option = readLine()!!.toInt()
if (option == 1) menuDrinkArrayList[order - 1].temperature = "아이스"
else menuDrinkArrayList[order - 1].temperature = "핫"
}
3 -> menuDrinkArrayList[2].temperature = "아이스"
4 -> menuDrinkArrayList[3].temperature = "핫"
0 -> {println("감사합니다. 또 오세요-!")
break}
}
when(order) {
1 -> println("${menuDrinkArrayList[0].temperature} ${menuDrinkArrayList[0].name}로 준비해드리겠습니다. 감사합니다-!")
2 -> println("${menuDrinkArrayList[1].temperature} ${menuDrinkArrayList[1].name}로 준비해드리겠습니다. 감사합니다-!")
3 -> println("${menuDrinkArrayList[2].temperature} ${menuDrinkArrayList[2].name}로 준비해드리겠습니다. 감사합니다-!")
4 -> println("${menuDrinkArrayList[3].temperature} ${menuDrinkArrayList[3].name}로 준비해드리겠습니다. 감사합니다-!")
}
}
9 -> {}
0 -> {println("감사합니다. 또 오세요-!")
break
}
}
}
2 -> {
println("어떤 디저트를 원하실까요? 번호를 입력해주세요.")
println("1. 타르트 2. 케이크 9. 뒤로가기 0. 종료")
userChoiceDessert = readLine()!!.toInt()
when (userChoiceDessert) {
1 -> {
println("어떤 타르트를 원하실까요? 번호를 입력해주세요.")
menuDessert = Dessert("에그타르트", 300)
menuDessertArrayList.add(menuDessert)
print("1. ")
menuDessertArrayList[0].information()
menuDessert = Dessert("피칸타르트",350)
menuDessertArrayList.add(menuDessert)
print("2. ")
menuDessertArrayList[1].information()
menuDessert = Dessert("애플시나몬타르트",400)
menuDessertArrayList.add(menuDessert)
print("3. ")
menuDessertArrayList[2].information()
menuDessert = Dessert("딸기타르트",450)
menuDessertArrayList.add(menuDessert)
print("4. ")
menuDessertArrayList[3].information()
println("9. 처음으로 0. 종료")
order = readLine()!!.toInt()

if (order != 9 && order != 0) {
println("선물포장을 원하시면 1을, 원치 않으시면 2를 입력해주세요.")
option = readLine()!!.toInt()
if(option == 1) menuDessert.gift()
}
else if(order == 0){
println("감사합니다. 또 오세요-!")
break
}
when(order) {//중복
1 -> println("${menuDessertArrayList[0].name}로 준비해드리겠습니다. 감사합니다-!")
2 -> println("${menuDessertArrayList[1].name}로 준비해드리겠습니다. 감사합니다-!")
3 -> println("${menuDessertArrayList[2].name}로 준비해드리겠습니다. 감사합니다-!")
4 -> println("${menuDessertArrayList[3].name}로 준비해드리겠습니다. 감사합니다-!")
}
}
2 -> { // 반복문으로 합치는 방법 고민해보기
println("어떤 케이크를 원하실까요? 번호를 입력해주세요.")
menuDessert = Dessert("티라미수", 500)
menuDessertArrayList.add(menuDessert)
print("1. ")
menuDessertArrayList[0].information()
menuDessert = Dessert("치즈케이크",550)
menuDessertArrayList.add(menuDessert)
print("2. ")
menuDessertArrayList[1].information()
menuDessert = Dessert("갸또쇼콜라",600)
menuDessertArrayList.add(menuDessert)
print("3. ")
menuDessertArrayList[2].information()
menuDessert = Dessert("얼그레이케이크",650)
menuDessertArrayList.add(menuDessert)
print("4. ")
menuDessertArrayList[3].information()
println("9. 처음으로 0. 종료")
order = readLine()!!.toInt()
if (order != 9 && order != 0) {
println("선물포장을 원하시면 1을, 원치 않으시면 2를 입력해주세요.")
option = readLine()!!.toInt()
if(option == 1) menuDessert.gift()
}
else if(order == 0){
println("감사합니다. 또 오세요-!")
break
}
when(order) {
1 -> println("${menuDessertArrayList[0].name}로 준비해드리겠습니다. 감사합니다-!")
2 -> println("${menuDessertArrayList[1].name}로 준비해드리겠습니다. 감사합니다-!")
3 -> println("${menuDessertArrayList[2].name}로 준비해드리겠습니다. 감사합니다-!")
4 -> println("${menuDessertArrayList[3].name}로 준비해드리겠습니다. 감사합니다-!")
}
}
9 -> {}
0 -> {println("감사합니다. 또 오세요-!")
break
}
}
}
3 -> {
println("어떤 상품을 원하실까요? 번호를 입력해주세요.")
menuProduct = Product("머그컵", 700)
menuProductArrayList.add(menuProduct)
print("1. ")
menuProductArrayList[0].information()
menuProduct = Product("텀블러",800)
menuProductArrayList.add(menuProduct)
print("2. ")
menuProductArrayList[1].information()
println("9. 처음으로 0. 종료")
order = readLine()!!.toInt()
when(order) {
1,2 -> {
print("${menuProductArrayList[order -1].name} 준비해드리겠습니다.")
menuProductArrayList[order -1].present()
println(" 감사합니다-!")
}
0 -> {
println("감사합니다. 또 오세요-!")
break
}
}
}
9 -> {}
0 -> {
println("감사합니다. 또 오세요-!")
break
}
}
println("-----------------------------------")
}
}

 

변경된 사항 :

  • 피드백대로 중복코드를 개선했다.
    메뉴는 리스트에 담아 for문으로 반복하도록 했고 주문이 끝났을 때 나오는 멘트는 한줄로 정리했다. for문으로 변경하는게 이번 과제에서 가장 어려웠다. 음료에 망고스무디는 only ice, 자몽티는 only hot을 넣는 바람에 조건이 까다로웠고 메뉴이름의 리스트를 이차원 리스트로 만들어서 그러했다. 
  • ArrayList에 이전 메뉴들이 그대로 담겨져있어 반복문 시작점에 clear()로 리스트들을 깨끗이 비우도록 했다.
  • 변하지 않는 값들은 val로 고쳤다. 
package com.example.hh_kiosk

fun main(){
    //카페 키오스크 : 음료, 디저트, 상품을 판매합니다.
    //부모 클래스
    open class CafeMenu(name:String, price:Int) {
        open var name = name
        open var price = price
        open fun information(){
            println("${name} : ${price}원")
        }
    }
    //자식 클래스_음료
    open class Drink(name:String, price:Int, temperature:String) : CafeMenu(name,price) {
        override var name = name
        override var price = price
        open var temperature = temperature
        override fun information() {
            println("${name}(${temperature}) : ${price}원")
        }
    }
    //자식 클래스_디저트
    open class Dessert(name:String, price:Int) : CafeMenu(name,price) {
        override var name = name
        override var price = price
        open fun gift() {
            print("예쁘게 포장된 ")
        }
        override fun information() {
            println("${name} : ${price}원")
        }
    }
    //자식 클래스_상품
    class Product(name:String, price:Int) : CafeMenu(name,price) {
        override var name = name
        override var price = price
        fun present(){
            print("(+에그 타르트 증정)")
        }
        override fun information() {
            println("${name} : ${price}원")
        }
    }
    //변수선언
    var userChoice : Int = 0
    var userChoiceDrink : Int = 0
    var userChoiceDessert : Int = 0
    var order : Int = 0
    var option : Int = 0
    val nameList = listOf(
        listOf("아메리카노", "카페라떼", "카페모카", "카라멜 마키아또"),
        listOf("말차라떼", "밀크티", "망고스무디", "자몽티"),
        listOf("에그타르트", "피칸타르트", "애플시나몬타르트", "딸기타르트"),
        listOf("티라미수", "치즈케이크", "갸또쇼콜라", "얼그레이케이크"),
        listOf("머그컵", "텀블러"),
    )

    //인스턴스,리스트
    var menuDrink = Drink("", 0, "")
    val menuDrinkArrayList = ArrayList<Drink>()
    var menuDessert = Dessert("",0)
    val menuDessertArrayList = ArrayList<Dessert>()
    var menuProduct = Product("",0)
    val menuProductArrayList = ArrayList<Product>()

    while(true){
        menuDrinkArrayList.clear()
        menuDessertArrayList.clear()
        menuProductArrayList.clear()

        //시작
        println("어서오세요-! 원하시는 번호를 입력해주세요.")
        println("1. 음료 2. 디저트 3. 상품 0. 종료")
        userChoice = readLine()!!.toInt()

        //메뉴
        when (userChoice) {
            1 -> {//음료
                println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                println("1. 커피 2. 커피가 아닌 음료 9. 처음으로 0. 종료")
                userChoiceDrink = readLine()!!.toInt()
                when (userChoiceDrink) {
                    1 -> {//커피
                        println("어떤 커피를 원하실까요? 번호를 입력해주세요.")
                        for(i in nameList[0].indices) {
                                val drinkPrice = 100 + 100 * i
                                menuDrink = Drink(nameList[0][i], drinkPrice, "ice/hot")
                                menuDrinkArrayList.add(menuDrink)
                                print("${i + 1}. ")
                                menuDrinkArrayList[i].information()
                        }
                        println("9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                        //옵션
                        if (order != 9 && order != 0) {
                            println("ice를 원하시면 1을, hot을 원하시면 2를 입력해주세요.")
                            option = readLine()!!.toInt()
                            if (option == 1) menuDrinkArrayList[order - 1].temperature = "아이스"
                            else menuDrinkArrayList[order - 1].temperature = "핫"
                        }
                        else if(order == 9){}
                        else if(order == 0){
                            println("감사합니다. 또 오세요-!")
                            break
                        }
                        if (order != 9) println("${menuDrinkArrayList[order - 1].temperature} ${menuDrinkArrayList[order - 1].name}로 준비해드리겠습니다. 감사합니다-!")
                    }
                    2 -> {//커피가 아닌 음료
                        println("어떤 음료를 원하실까요? 번호를 입력해주세요.")
                        for(i in nameList[1].indices) {
                            val drinkPrice = 200 + 100 * i
                            when(nameList[1][i]) {
                                "망고스무디" -> menuDrink = Drink(nameList[1][i], drinkPrice, "only ice")
                                "자몽티" -> menuDrink = Drink(nameList[1][i], drinkPrice, "only hot")
                                else -> menuDrink = Drink(nameList[1][i], drinkPrice, "ice/hot")}
                            menuDrinkArrayList.add(menuDrink)
                            print("${i + 1}. ")
                            menuDrinkArrayList[i].information()
                        }
                        println("9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                        //옵션
                        when (order) {
                            1,2 -> {println("ice를 원하시면 1을, hot을 원하시면 2를 입력해주세요.")
                                option = readLine()!!.toInt()
                                if (option == 1) menuDrinkArrayList[order - 1].temperature = "아이스"
                                    else menuDrinkArrayList[order - 1].temperature = "핫"
                                }
                            3 -> menuDrinkArrayList[2].temperature = "아이스"
                            4 -> menuDrinkArrayList[3].temperature = "핫"
                            0 -> {println("감사합니다. 또 오세요-!")
                                break}
                        }
                        if (order != 9) println("${menuDrinkArrayList[order - 1].temperature} ${menuDrinkArrayList[order - 1].name}로 준비해드리겠습니다. 감사합니다-!")
                    }
                    9 -> {}
                    0 -> {println("감사합니다. 또 오세요-!")
                        break
                    }
                }
            }
            2 -> {//디저트
                println("어떤 디저트를 원하실까요? 번호를 입력해주세요.")
                println("1. 타르트 2. 케이크 9. 뒤로가기 0. 종료")
                userChoiceDessert = readLine()!!.toInt()
                when (userChoiceDessert) {
                    1 -> {//타르트
                        println("어떤 타르트를 원하실까요? 번호를 입력해주세요.")
                        for(i in nameList[2].indices) {
                            val dessertPrice = 300 + 100 * i
                            menuDessert = Dessert(nameList[2][i], dessertPrice)
                            menuDessertArrayList.add(menuDessert)
                            print("${i + 1}. ")
                            menuDessertArrayList[i].information()
                        }
                        println("9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                        //옵션
                        if (order != 9 && order != 0) {
                            println("선물포장을 원하시면 1을, 원치 않으시면 2를 입력해주세요.")
                            option = readLine()!!.toInt()
                                if(option == 1) menuDessert.gift()
                        }
                        else if(order == 0){
                            println("감사합니다. 또 오세요-!")
                            break
                        }
                        if (order != 9) println("${menuDessertArrayList[order - 1].name}로 준비해드리겠습니다. 감사합니다-!")
                    }
                    2 -> {//케이크
                        println("어떤 케이크를 원하실까요? 번호를 입력해주세요.")
                        for(i in nameList[3].indices) {
                            val dessertPrice = 500 + 100 * i
                            menuDessert = Dessert(nameList[3][i], dessertPrice)
                            menuDessertArrayList.add(menuDessert)
                            print("${i + 1}. ")
                            menuDessertArrayList[i].information()
                        }
                        println("9. 처음으로 0. 종료")
                        order = readLine()!!.toInt()
                        //옵션
                        if (order != 9 && order != 0) {
                            println("선물포장을 원하시면 1을, 원치 않으시면 2를 입력해주세요.")
                            option = readLine()!!.toInt()
                                if(option == 1) menuDessert.gift()
                        }
                        else if(order == 0){
                            println("감사합니다. 또 오세요-!")
                            break
                        }
                        if (order != 9) println("${menuDessertArrayList[order - 1].name}로 준비해드리겠습니다. 감사합니다-!")
                    }
                    9 -> {}
                    0 -> {println("감사합니다. 또 오세요-!")
                        break
                    }
                }
            }
            3 -> {//상품
                println("어떤 상품을 원하실까요? 번호를 입력해주세요.")
                for(i in nameList[4].indices) {
                    val productPrice = 900 + 100 * i
                    menuProduct = Product(nameList[4][i], productPrice)
                    menuProductArrayList.add(menuProduct)
                    print("${i + 1}. ")
                    menuProductArrayList[i].information()
                }
                println("9. 처음으로 0. 종료")
                order = readLine()!!.toInt()
                when(order) {
                    1,2 -> {
                        print("${menuProductArrayList[order -1].name} 준비해드리겠습니다.")
                        menuProductArrayList[order -1].present()
                        println(" 감사합니다-!")
                        }
                    0 -> {
                    println("감사합니다. 또 오세요-!")
                    break
                    }
                }
            }
            9 -> {}
            0 -> {
                println("감사합니다. 또 오세요-!")
                break
                }
            }
    println("-----------------------------------")
    }
}

 

 

 

 


 

회고

2단계까지는 비교적 빠르게 완성했던터라 예외처리까지는 하고 싶었는데 3단계 클래스 타입과 ArrayList에서 1차, List와 for문에서 2차로 헤맸더니 시간이 부족했다. 과제를 만들면서 흥미가 커졌고 많이 배울 수 있는 기회였다.