추상클래스와 상속의 개념을 이해했다고 생각했는데 막상 새로운 프로젝트에 적용하려고 하니 막막했다. 개념을 짚고 넘어가는 것도 중요하지만 많은 예제를 따라하고 응용해보며 사용법을 익혀야겠다고 생각했다. 추가적으로 구현해야 할 기능은 많지만 내일은 우선적으로 객체별 아이템 목록을 출력하는 부분을 구현하려고 한다. 한가지 걸리는 부분은 목록을 출력할 때 아이템의 인덱스도 함께 출력하고 싶은데 아이템이 인덱스를 가지고 있지 않아 수정이 필요해 보인다. 🥲
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()
}
}
AbstractMenu
추상 클래스의 속성과 함수를 상속 받아 사용한다. class Burger(name: String, price: Int, explain: String) :
AbstractMenu(name, price, explain) {
override fun displayInfo() {
println("%-10s | ₩ %4d | %s".format(name, price, explain))
}
}
AbstractMenu
추상 클래스의 속성과 함수를 상속 받아 사용한다. 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))
}
}
AbstractMenu
추상 클래스의 속성과 함수를 상속 받아 사용한다.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))
}
}
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
}
}
}
}
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
}
}