어제에 이어서 오늘은 클래스를 만들고, 그 클래스들이 작동해서 메뉴를 가동시키고 메인파일은 중계만 하도록 만들어 본다!
버거메뉴 클래스 파일을 이렇게 만든다.
class BurgerMenu {
companion object {
val menuItems = arrayOf(
"와퍼 | W 8.0 | 불에 직접 구운 순 쇠고기 패티에 싱싱한 야채가 한가득~ 버거킹의 대표 메뉴!",
"불고기와퍼 | W 8.0 | 불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 달콤한 불고기 소스까지!",
"치즈와퍼 | W 8.6 | 불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 고소한 치즈까지!",
"통새우와퍼 | W 8.8 | 불맛 가득 순쇠고기, 갈릭페퍼 통새우, 스파이시토마토소스가 더해진 프리미엄 버거!",
)
}
fun showMenu() {
println("[ Burgers MENU ]")
menuItems.forEachIndexed { index, menu ->
println("${index + 1}. $menu")
}
println("0. 뒤로가기")
}
}
음료도
class DrinkMenu {
companion object {
val menuItems = arrayOf(
"콜라 | W 2.9 | 코카-콜라로 더 짜릿하게!",
"사이다 | W 2.9 | 나를 깨우는 상쾌함!",
"아메리카노 | W 2.4 | 자연을 담은 버거킹 RA인증커피"
)
}
fun showMenu() {
println("[ Drink MENU ]")
menuItems.forEachIndexed { index, menu ->
println("${index + 1}. $menu")
}
println("0. 뒤로가기")
}
}
메인 파일은
fun main() {
println("========================================")
println(" 버거킹에 오신걸 환영 합니다! ")
println("========================================")
val burgerMenu = BurgerMenu()
val drinkMenu = DrinkMenu()
while (true) {
try {
println("메뉴를 선택하세요:")
println("1. 버거")
println("2. 음료")
println("3. 종료")
print(" ---> ")
val input = readLine()!!.toInt()
when (input) {
1 -> {
burgerMenu.showMenu()
val burgerInput = readLine()!!.toInt()
when (burgerInput) {
0 -> {
}
in 1..BurgerMenu.menuItems.size -> {
println("선택한 버거: ${BurgerMenu.menuItems[burgerInput - 1]}")
}
else -> {
println("올바른 번호를 입력하세요.")
}
}
}
2 -> {
drinkMenu.showMenu()
val drinkInput = readLine()!!.toInt()
when (drinkInput) {
0 -> {
}
in 1..DrinkMenu.menuItems.size -> {
println("선택한 음료: ${DrinkMenu.menuItems[drinkInput - 1]}")
}
else -> {
println("올바른 번호를 입력하세요.")
}
}
}
3 -> {
println("프로그램을 종료합니다.")
break
}
else -> {
println("1, 2, 3 중에서 선택하세요.")
}
}
} catch (e: NumberFormatException) {
println("올바른 숫자를 입력하세요.")
}
}
}
그러면 1번을 누르면 burgerMenu.showMenu()로 인해 클래스 버거메뉴로 넘어가고 그 내부에서 숫자를 누르면
in 1..BurgerMenu.menuItems.size -> {
println("선택한 버거: ${BurgerMenu.menuItems[burgerInput - 1]}") 이걸로 역시 클래스 내부의 버거들을 선택해서 선택한버거: 버거이름이 나오는 것이다.
음료도 동일하게 작동한다.
그런데 다시보니 클래스를 name: String, price: Int, displayInfo(): Unit을 써야하는데 쓰지 않아서 다시 변경해야 했다.
메뉴아이템이라는 새 파일을 만들고
interface MenuItem {
val name: String
val price: Int
val description: String
fun displayInfo()
}
이것을 통해 클래스에 name: String, price: Int, displayInfo():를 넣는다.
그로고 다른 클래스들도 변형시키고, 저 셋의 추가로 동시에 이름, 가격 설명을 따로 출력할수 있게 됬으니
class Drink(
override val name: String,
override val price: Int,
override val description: String
) : MenuItem {
override fun displayInfo() {
println("음료 이름: $name")
println("가격: $price 원")
println("설명: $description")
}
}
이렇게 인터페이스와 음료를 엮어서 출력할수 있게 만든다. 버거도 동일하다.
class Burger(
override val name: String,
override val price: Int,
override val description: String
) : MenuItem {
override fun displayInfo() {
println("버거 이름: $name")
println("가격: $price 원")
println("설명: $description")
}
}
이렇게 버거메뉴를 버거 클래스로 메뉴아이템과 연결시키고
class BurgerMenu {
val menuItems = arrayOf(
Burger("와퍼", 8000, "불에 직접 구운 순 쇠고기 패티에 싱싱한 야채가 한가득~ 버거킹의 대표 메뉴!"),
Burger("불고기와퍼", 8000, "불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 달콤한 불고기 소스까지!"),
Burger("치즈와퍼", 8600, "불에 직접 구운 순 쇠고기 패티가 들어간 와퍼에 고소한 치즈까지!"),
Burger("통새우와퍼", 8800, "불맛 가득 순쇠고기, 갈릭페퍼 통새우, 스파이시토마토소스가 더해진 프리미엄 버거!")
)
fun showMenu() {
println("[ Burgers MENU ]")
menuItems.forEachIndexed { index, menuItem ->
println("${index + 1}. ${menuItem.name}")
}
println("0. 뒤로가기")
}
}
val menuItems = arrayOf( 덕분에 메뉴 아이템과 연결되서 이름,가격,설명이 각각 출력 되도록 한다.
참고로 메인은
fun main() {
println("========================================")
println(" 버거킹에 오신걸 환영 합니다! ")
println("========================================")
val burgerMenu = BurgerMenu()
val drinkMenu = DrinkMenu()
while (true) {
try {
println("메뉴를 선택하세요:")
println("1. 버거")
println("2. 음료")
println("3. 종료")
print(" ---> ")
val input = readLine()!!.toInt()
when (input) {
1 -> {
burgerMenu.showMenu()
val burgerInput = readLine()!!.toInt()
when (burgerInput) {
0 -> {
// 이전 화면으로 돌아가기
}
in 1..burgerMenu.menuItems.size -> {
burgerMenu.menuItems[burgerInput - 1].displayInfo()
}
else -> {
println("올바른 번호를 입력하세요.")
}
}
}
2 -> {
drinkMenu.showMenu()
val drinkInput = readLine()!!.toInt()
when (drinkInput) {
0 -> {
// 이전 화면으로 돌아가기
}
in 1..drinkMenu.menuItems.size -> {
drinkMenu.menuItems[drinkInput - 1].displayInfo()
}
else -> {
println("올바른 번호를 입력하세요.")
}
}
}
3 -> {
println("프로그램을 종료합니다.")
break
}
else -> {
println("1, 2, 3 중에서 선택하세요.")
}
}
} catch (e: NumberFormatException) {
println("올바른 숫자를 입력하세요.")
}
}
}
근데 만들고 나니 메뉴를 표시할때 가격과 설명이 나오지 않고 메뉴를 고른 뒤에야 가격이 나오지 않는가! 그래선 메뉴라 부를수 없으니 수정해 보았다.
fun showMenu() {
println("[ Burgers MENU ]")
menuItems.forEachIndexed { index, menuItem ->
println("${index + 1}. ${menuItem.name} | 가격: ${menuItem.price} 원 | 설명: ${menuItem.description}")
}
println("0. 뒤로가기")
print(" ---> ")
}
이걸 음료에도 똑같이 적용해 보았다. 그리고--->도 추가해 숫자를 입력할 칸도 추가했다. 물론 숫자는 아무데나 입력해도 작동하지만...
그리고 이제 이것들을 하나의 객체 list로 정리하라는데, 여러개로 나뉜 클래스들을 합치라는 것인가? 기껏 나눈걸 합치다니! 이건 아무래도 다음에 이어서 해야겠다.