[Android / Kotlin] 키오스크 프로그램 구현 (1)

Subeen·2023년 12월 6일
1

Kotlin 문법

목록 보기
13/23

추상클래스와 상속의 개념을 이해했다고 생각했는데 막상 새로운 프로젝트에 적용하려고 하니 막막했다. 개념을 짚고 넘어가는 것도 중요하지만 많은 예제를 따라하고 응용해보며 사용법을 익혀야겠다고 생각했다. 추가적으로 구현해야 할 기능은 많지만 내일은 우선적으로 객체별 아이템 목록을 출력하는 부분을 구현하려고 한다. 한가지 걸리는 부분은 목록을 출력할 때 아이템의 인덱스도 함께 출력하고 싶은데 아이템이 인덱스를 가지고 있지 않아 수정이 필요해 보인다. 🥲

AbstractMenu.kt

  • Burger, Beverage, Fried 클래스에서 공통된 개념을 표현하고자 추상 클래스를 생성하였다.
  • 메뉴 아이템의 정보(name=이름, price=가격, explain=설명)와 아이템 정보를 출력하는 displayInfo() 추상 메소드가 포함되어 있다.
abstract class AbstractMenu(val name: String, val price: Int, val explain: String) {
    abstract fun displayInfo()
}
  • AbstractMenu 추상 클래스를 상속 받은 하위 클래스들을 abstractMenu객체로 받아 외부로부터 fun displayInfo()를 호출할시 abstractMenu 객체의 displayInfo() 함수를 호출한다.
class MenuManage(private val abstractMenu: AbstractMenu) {
    fun displayInfo() {
        abstractMenu.displayInfo()
    }
}

Burger.kt

  • 버거 메뉴 정보를 가지고 있는 클래스로 AbstractMenu 추상 클래스의 속성과 함수를 상속 받아 사용한다.
  • displayInfo() 함수에서 버거 메뉴의 이름, 가격, 설명 정보를 출력한다.
class Burger(name: String, price: Int, explain: String) :
    AbstractMenu(name, price, explain) {
    override fun displayInfo() {
        println("%-10s | ₩ %4d | %s".format(name, price, explain))
    }
}

Beverage.kt

  • 음료 메뉴 정보를 가지고 있는 클래스로 AbstractMenu 추상 클래스의 속성과 함수를 상속 받아 사용한다.
  • displayInfo() 함수에서 음료 메뉴의 이름, 가격, 설명, 사이즈 정보를 출력한다.
class Beverage(
    name: String, price: Int, explain: String, private val size: String) :
    AbstractMenu(name, price, explain) {
    override fun displayInfo() {
        println("%s - %-5s| ₩ %4d | %s".format(name, size, price, explain))
    }
}

Fried.kt

  • 사이드 메뉴 정보를 가지고 있는 클래스로 AbstractMenu 추상 클래스의 속성과 함수를 상속 받아 사용한다.
  • displayInfo() 함수에서 사이드 메뉴의 이름, 가격, 설명, 사이즈 정보를 출력한다.
class Fried(name: String, price: Int, explain: String, private val size: String) :
    AbstractMenu(name, price, explain) {
    override fun displayInfo() {
        println("%s - %-5s| ₩ %4d | %s".format(name, size, price, explain))
    }
}

Kiosk.kt

fun main() {
    val products: ArrayList<AbstractMenu> = initProduct()
    while (true) {
        displayMain()
        val input = readln()
        var select: Int = 0
        if (input.isNumber()) {
            select = input.toInt()
        } else {
            continue
        }

        when (select) {
            0 -> {
                println("프로그램을 종료 합니다.")
                break
            }

            1 -> {
            	// TODO
                for (item in products) {
                    if (item is Burger) {
                        MenuManage(item).displayInfo()
                    }
                }
            }

            2 -> {
				// TODO
            }

            3 -> {
				// TODO
            }
        }
    }
}
  • Burger, Beverage, Fried 세 개의 클래스를 상위 클래스로 묶어 하나의 리스트로 여러 개의 클래스를 관리한다.
  • 세 개의 카테고리의 메뉴 아이템을 리스트에 저장한다.
fun initProduct(): ArrayList<AbstractMenu> {
    val products = ArrayList<AbstractMenu>()

    val burger = arrayListOf<AbstractMenu>(
        Burger("빅맥", 5500, "100% 순 쇠고기 패티 두 장에 치즈, 양상추, 피클"),
        Burger("맥크리스피 디럭스 버거", 6800, "100% 통다리살 케이준 치킨 패티, 포테이포 브리오쉬 번"),
        Burger("맥크리스피 상하이 버거", 5500, "100% 닭가슴살 통살 위에 양상추, 토마토, 치킨 패티")
    )

    val beverage = arrayListOf<AbstractMenu>(
        Beverage("아메리카노", 1000, "바로 내린 100% 친환경 커피로 더 신선하게! 더 풍부하게!", "스몰"),
        Beverage("아메리카노", 1500, "바로 내린 100% 친환경 커피로 더 신선하게! 더 풍부하게!", "미디엄"),
        Beverage("카페라떼", 1500, "바로 내린 100% 친환경 커피가 신선한 우유를 만나 더 신선하고 부드럽게!", "스몰"),
        Beverage("카페라떼", 2000, "바로 내린 100% 친환경 커피가 신선한 우유를 만나 더 신선하고 부드럽게!", "미디엄"),
        Beverage("코카콜라", 1700, "갈증해소 뿐만이 아니라 기분까지 상쾌하게! 코카-콜라", "스몰"),
        Beverage("코카콜라", 2200, "갈증해소 뿐만이 아니라 기분까지 상쾌하게! 코카-콜라", "미디엄")
    )

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

    products.addAll(burger)
    products.addAll(beverage)
    products.addAll(fried)

    return products
}
  • 메인 메뉴를 출력하는 함수
fun displayMain() {
    val category = arrayListOf("Burger", "Side & Dessert", "Mac Cafe & Beverage")
    val explain = arrayListOf(
        "주문 즉시 바로 조리해 더욱 맛있는, 맥도날드의 다양한 버거를 소개합니다.",
        "버거와 함께 즐기면 언제나 맛있는 사이드와 디저트 메뉴!",
        "언제나 즐겁게, 맥카페와 다양한 음료를 부담없이 즐기세요!"
    )
    println(
        "아래 메뉴판을 보시고 메뉴를 골라 입력해주세요. \n" +
                "[ McDonald's's MENU ]"
    )
    for (i in category.indices) {
        println("%d. %-20s | %s".format(i + 1, category[i], explain[i]))
    }
    println("%d. %-20s | %s".format(0, "종료", "프로그램 종료"))
}
  • 숫자만 입력 받기 위해 입력 된 값이 숫자인지 아닌지 판단하는 함수
fun String.isNumber(): Boolean {
    return try {
        this.toInt()
        true
    } catch (e: NumberFormatException) {
        false
    }
}
profile
개발 공부 기록 🌱

0개의 댓글