[TIL]Kotlin 키오스크 구현하기 4 -팀 협업

지혜·2023년 12월 8일

Android_TIL

목록 보기
14/70

✏231208 금요일 TIL(Today I learned) 오늘 배운 것

  • 오늘은 3일간 만든 개인 코드들을 총합하여 하나의 팀 키오스크를 만드는 시간을 가졌다.
  • 코드를 총합하는데에는 팀장님이 힘써주셨다. 모든 팀원의 코드 중 활용도가 높은 것을 바탕으로 하나로 엮어주셨는데, 능력자이시다. 멋있었다.
  • 그리고, 총합한 코드에 장바구니 카트 리스트를 출력할 수 있게 개인적으로 구현해보는 시간을 추가로 가졌다. 그렇게 종합적으로 구현한 코드는 "팀장님의 깃허브(Repository-Kiosk_team7)"를 통해 확인할 수 있다.

📖선택 구현 사항 - Lv4. 장바구니 메뉴 추가 및 총 금액 출력

  • 여기에 적은 코드는, 최종 팀 코드가 아닌 추가 시간에 개인적으로 구현한 장바구니 기능에 대한 것이다. 오늘 스스로 배운 것!
  • 전체코드는 Android_ch2_KiosK의 TeamKiosk파일 에서 확인할 수 있다.

package com.example.kioskproject

class MenuList { // 일반 클래스로 사용하기 때문에 open 키워드 제거

    var cartList = arrayListOf<AbstractMenu>()

    var category = arrayListOf<AbstractMenu>()

    // 아이템 리스트는 외부에서 사용하지 않으므로 private로 선언
    private val hamburgerItems: ArrayList<AbstractMenu> = arrayListOf(
        Burger(1, "hamburger", "더블비프미트칠리버거", 3800, "매운맛의 더블 비프 패티 버거"),
        Burger(2, "hamburger", "더블쿼터파운더치즈", 3800, "더블 쿼터파운더와 치즈의 만남"),
        Burger(3, "hamburger", "맥스파이시", 4800, "매운맛의 크리스피 치킨 버거"),
        Burger(4, "hamburger", "불고기버거", 3900, "한국식 불고기 소스의 버거"),
        Burger(5, "hamburger", "빅맥", 4300, "큰 사이즈의 빅맥 버거")
    )
    private val drinkItems: ArrayList<AbstractMenu> = arrayListOf(
        Beverage(1, "drink", "코카콜라", 1500, "시원한 음료수", "Small"),
        Beverage(2, "drink", "코카콜라제로", 1500, "칼로리 제로 음료수", "Medium"),
        Beverage(3, "drink", "스프라이트", 1500, "레몬라임 맛 음료수", "Large"),
        Beverage(4, "drink", "환타", 1500, "과일 맛 음료수", "Regular"),
        Beverage(5, "drink", "오렌지쥬스", 2000, "신선한 오렌지 주스", "N/A")
    )

    // 사이드 메뉴 추가
    private val friedItems: ArrayList<AbstractMenu> = arrayListOf(
        Fried(1, "fried", "골든 모짜렐라 치즈스틱", 2000, "자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱", "2조각"),
        Fried(2, "fried", "골든 모짜렐라 치즈스틱", 4200, "자연 모짜렐라 치즈로 빈틈 없이 고소한 치즈스틱", "4조각"),
        Fried(3, "fried", "맥너겟", 2600, "바삭하고 촉촉한 치킨이 한 입에 쏙", "4조각"),
        Fried(4, "fried", "맥너겟", 3800, "바삭하고 촉촉한 치킨이 한 입에 쏙", "6조각"),
    )

    init {
        category.addAll(hamburgerItems)
        category.addAll(drinkItems)
        category.addAll(friedItems)
    }

    fun displayMenu(menu: String) {  // 카테고리별 메뉴 목록 출력하는 함수
        category.filter { it.category == menu }.forEach { println("${it.id}. ${it.displayInfo()}") }
        println("%d. %-10s | %s".format(0, "뒤로가기", "뒤로가기\n"))
    }

    fun getSelectedItem(menu: String, id: Int): AbstractMenu? {
        return category.filter { it.category == menu }.find { it.id == id }
    }

    fun getMenuCount(menu: String): Int {
        return category.count { it.category == menu }
    }

    fun addItemToCart(item: AbstractMenu?) {
        if (item == null) {
            println("선택하신 상품이 존재하지 않습니다. 관리자에게 문의해주세요.")
        } else {
            cartList.add(item)
            println("${item.name} 장바구니 추가 완료!\n")

        }
    }

    fun selectOrderOption() {

        while (true) {

            println("\n[Order MENU]")
            println("1. 장바구니 확인 및 주문하기")
            println("2. 메인메뉴로 돌아가기")
            println("3. 주문 취소 및 프로그램 종료")

            var selectOrderOption = SelectInput().selectInput("selectString").toString()

            println("")

            when (selectOrderOption) {
                "1" -> {
                    if(cartList.size != 0){
                        println("주문하신 메뉴 입니다.")
                        showCartList(cartList)
                        println(" 0. 더 주문하기  1. 최종 주문 완료 ")

                        when (SelectInput().selectInput("selectInt").toString().toInt()) {
                            0 -> {
                                return
                            }
                            1 -> {
                                // 주문 종료
                                println("주문이 완료되었습니다. 감사합니다.")
                                cartList.clear()
                                System.exit(0)
                            }
                            else -> {
                                println("잘못된 번호를 입력했어요. 다시 입력해주세요.")
                            }
                        }

                    } else {
                        println("장바구니가 비어 있습니다.")
                    }

                }

                "2" -> {
                    println("메인메뉴로 돌아갑니다.")
                    return
                }

                "3" -> {
                    println("프로그램이 종료됩니다.")
                    System.exit(0)
                }

                else -> {
                    println("잘못된 입력입니다. 정확하게 입력해주세요.")
                }

            }
        }
    }


    fun showCartList(cartList : List<AbstractMenu>) {

        var totalPrice = 0

        cartList.forEachIndexed{idx,item ->
            println("${idx + 1}. ${MenuManage(item).displayInfo()}")
            totalPrice += item.price
        }

        println("\n총 가격: $totalPrice 원 입니다.\n")

    }
}

  • 내 개인과제 코드에서도 문제였던건 selectOrderOption( ) 메소드였다. 펑션으로 한 번 더 안으로 들어가니까, addItemToCart까지만 들어가지고, 바로 cartList가 공유되지 못하는게 문제였다고 생각한다.
  • 개인과제 코드에서는 main에 작성했던 전체메뉴리스트들을, 팀 코드에서는 따로 클래스를 만들어 관리해주었다. 그래서 이 곳에 cartList 리스트를 선언해주고, 그 리스트를 인자로 받아 데이터들이 공유될 수 있도록 고쳐주었다.

📖오늘 발생 문제 및 해결

  • 또 다른 팀원 분들과 대화를 할 수 있는 시간이 있었는데, 거기에서 컴페니언 오브젝트를 활용하면 클래스간 데이터 공유가 쉽다는 이야기를 들었다. 컴페니언 오브젝트? 일단 이론적으로 배운 부분이라 그 얘기를 듣고 충격이었다. 스스로 많이 써봐서 익숙한 모양이 아니면 일단 낯설어하면서 잘 안쓰는 버릇이 있는데, 어떤 면에서는 이해가 쉽고 깔끔해보이는게 좋지만, 대신 아는게 많아야 활용도가 높다는 것을 새삼 깨달았다. 다른 분들의 깃허브와 벨로그 보는 것을 추천해주셨는데, 한 번 천천히 돌아봐야겠다.
  • 또 오늘의 문제는, 코드 상의 문제는 아니고 깃 사용에서 있었다. 그냥 pull하고 push하는게 왜 그렇게 안되는지.. 개인적으로 깃을 올릴 때에도 LF will be replaced by CRLF 오류부터 fatal: refusing to merge unrelated histories 까지 한번에 push되는법이 없고, 팀협업으로 깃브랜치를 여러개 사용할 때는 아직도 내가 현재 사용하는 브랜치와, 올려야하는 브랜치와, 합쳐야하는 브랜치와.... 경로를 머리속에 명확히 그리지 못해서 헷갈리는 부분이 컸다. 이 또한 많이 사용하면 차차 나아질 부분이라고 생각한다.
  • LF will be replaced by CRLF 오류의 경우는 프로젝트 마다 안뜨는 법이 없었는데 윈도우 도스 기준 git config --global core.autocrlf true 을 쓰면 해결이 된다고 한다.

📖키오스크 과제 느낀점

  • 제공한 강의를 전반적으로 활용해야 쉽게 작성할 수 있었던거라고, 제공해준 해설강의와 여러사람과 대화를 나눈 후에야 깨달았다.
  • 솔직히 강의를 들을 때면, 그렇구나! 하는 걸 아는데, 왜 쓰는지 무슨 역할인지 알겠는데.. 직접 쓰는데에는 왜 낯설어하는지 모르겠다. 근데 원래 글쓰기도 요구와 안내사항이 자세할 수록 쓰기 편하듯이, 코딩도 요구사항이 명확해야 작성하기가 편한데, 계산기 때는 요구사항에 대한 이해를 내가 하기 쉬웠고, 이번 과제는 그 요구사항을 읽기에 내 레벨이 부족했다는걸 알았다. 그래도 여하튼 결과물의 방향은 어찌저찌 따라가는 것 같아서 다음주 수준별 학습에는 겁내지 말고 중급반을 가기로 했다. 초급반에 가면 너무 아쉬울 것 같기도 하고, 하나를 여러번 하는 것보다 다양한 걸 많이 겪어보는게 지금 나에게 더 유리한 것 같다.
  • 이번 과제는 코드보다는 개인적인 심경도 많이 적고, 여러모로 어지러워하는걸 많이 표현했지만, 이 느낌 또한 경험으로 삼아서 부족한 점을 깨달았으니 다음주부터는 확실히 보강해서 좀 더 체계적일 수 있도록할 것이다. 파이팅!!!
profile
파이팅!

0개의 댓글