✏231207 목요일 TIL(Today I learned) 오늘 배운 것
📖기본 기능 구현 - Lv3. 상속관계 구현 및 하나의 리스트 객체 사용하기
[메뉴 번호 입력 받을 때 예외 처리]
package com.example.mykiosk
class InputNumber {
fun inputNumber(type: String): Any? {
return when (type) {
"selectInt" -> {
println("")
println("원하는 번호를 입력해주세요.")
while (true) {
try {
var selectInt: String? = readLine()
return selectInt?.toInt() ?: -1
} catch (e: Exception) {
println("올바른 번호를 다시 선택해주세요. 숫자만 입력 가능 합니다.")
}
}
}
"selectDouble" -> {
println("")
println("원하는 번호를 입력해주세요.")
while (true) {
try {
var selectDouble: String? = readLine()
return selectDouble?.toDouble() ?: -1.0
} catch (e: Exception) {
println("올바른 번호를 다시 선택해주세요. 숫자(소수점 가능)만 입력 가능 합니다.")
}
}
}
"selectString" -> {
println("")
println("메뉴를 입력해주세요.")
while (true) {
try {
var selectString: String? = readLine()
return selectString?: -1
} catch (e: Exception) {
println("영어 소문자로 정확하게 입력해주세요.")
}
}
}
else -> {
return "no"
}
}
}
- 저번에 다짐한 것 처럼 중복되는 내용을 삭제하고, int와 double형으로 나눈거에 더해서 string을 받을수있는 것도 만들어보았다.
- when에서 0번으로 종료를 하기에 애매한 부분이 생겼다고 생각해서 만들었는데, while문 제어를 잘하면 또 고칠수 있을 것도 같고.., 여하튼 지금은 종료를 할 때 사용중이다.
[메뉴 클래스와 상속받는 버거, 음료 클래스]
package com.example.mykiosk
open class Menu(var name : String, var price : Int)
package com.example.mykiosk
class Burger(var burgerName: String, var burgerPrice: Int) : Menu(burgerName, burgerPrice) {
}
package com.example.mykiosk
class McCafe(var mcCafeName : String, var mcCafePrice : Int) : Menu(mcCafeName,mcCafePrice) {
}
- 메뉴를 상속받아서 이름과, 가격을 가지고있는 형태가 되었다.
- main에서 전체메뉴리스트를 받을 때 사용한다.
[Order클래스]
package com.example.mykiosk
class Order() {
fun orderOption() {
var select = ""
while (select != "q") {
println("b. 메인메뉴로 돌아가기")
println("q. 주문 취소 및 프로그램 종료")
var selectOrderOption = InputNumber().inputNumber("selectString").toString()
println("")
when (selectOrderOption) {
"b" -> {
println("메인메뉴로 돌아갑니다.")
main()
}
"q" -> {
println("프로그램이 종료됩니다.")
select = "q"
break
}
else -> {
println("잘못된 입력입니다. 정확하게 입력해주세요.")
}
}
}
}
fun order(menu: Menu) {
println("")
println("${menu.name}은 ${menu.price}원 입니다. 장바구니에 추가하시겠습니까?")
println("[y] 추가 [n] 취소")
while (true) {
var selectMenuOrder = InputNumber().inputNumber("selectString").toString()
when (selectMenuOrder) {
"y" -> {
println("${menu.name} 장바구니 추가 완료!")
println("전체메뉴로 돌아갑니다.")
println("")
return
}
"n" -> {
println("취소하셨습니다. 전체 메뉴로 돌아갑니다.")
return
}
else -> {
println("잘못된 입력입니다. 영어 소문자로 정확히 입력해주세요.")
}
}
}
}
}
- 어제 장바구니 기능을 구현할 OrderCart클래스 대신에 Order클래스를 만들었다.
- 주문 외의 기능을 담당하는 orderOption펑션과 장바구니에 담아주는 order펑션이 있다.
- orderOption은 겹친다고 생각해서 어디서든 사용할 수 있게 빼놓은건데, 시간이 없어서 적절히 넣을 곳을 못찾고 메인화면만 연결이 되어있다. 여기서는 selectOrderOption이 숫자모양이 아닌 문자모양을 받는다. 잘못 입력되었을 때 반복이 되어야 하니까, while문을 걸어두었다. 반복되는 부분을 잘 조절 해야겠다.
- order펑션은 만드느라 머리 좀 싸맸다. menu를 인자로 받게 만드는 게 쉽지 않았다. 장바구니에 담는 기능은 lv4로 미뤄두고, 그냥 메뉴를 골랐다는 구색을 맞추는데 초점을 뒀다. 이걸 바탕으로 장바구니 기능을 만들 수 있는지는 내일 다시 천천히 봐야겠다..
[메인화면]
package com.example.mykiosk
fun main() {
val order = Order()
val burger = Burger("",0)
val allMenusList = mutableMapOf<String,String>()
allMenusList.put("Order", "장바구니를 확인하거나 취소합니다.")
allMenusList.put("Burgers","주문 즉시 요리하는 버거 메뉴")
allMenusList.put("McCafe","다양한 음료 메뉴")
val burgerList = mutableListOf<Menu>(
Burger("맥스파이시 상하이 버거 단품", 5500),
Burger("맥크리스피 디럭스 버거 단품", 6800)
)
val mcCafeList = mutableListOf<Menu>(
McCafe("Hot-드립커피", 2000),
McCafe("Ice-드립커피", 1800)
)
val detailedMenu = mutableListOf<List<Menu>>()
detailedMenu.add(burgerList)
detailedMenu.add(mcCafeList)
println("")
println("[맥도날드 키오스크]")
println("")
while (true) {
println("[전체 메뉴 : 번호를 입력하시면 상세 메뉴 페이지로 이동합니다.]")
for (i in 0 until allMenusList.size) {
val key = allMenusList.keys.toList()[i]
val value = allMenusList.values.toList()[i]
println("$i. $key : $value")
}
val selectAllMenu = InputNumber().inputNumber("selectInt").toString().toInt()
val keys = allMenusList.keys.toList()
val idxKey = keys[selectAllMenu]
println("")
println("---------------------------------------------------")
println("${idxKey}의 상세 페이지로 이동합니다.")
when (selectAllMenu) {
0 ->{
order.orderOption()
break
}
1 -> {
detailedDisplay(burgerList)
var selectBurgerMenu = InputNumber().inputNumber("selectInt").toString().toInt()
order.order(burgerList.get(selectBurgerMenu-1))
}
2 -> {
detailedDisplay(mcCafeList)
var selectMcCafeMenu = InputNumber().inputNumber("selectInt").toString().toInt()
order.order(mcCafeList.get(selectMcCafeMenu-1))
}
else -> {
println("잘못된 번호입니다. 올바른 번호를 입력해주세요.")
}
}
}
}
fun detailedDisplay(detailedMenu : List<Menu>) {
detailedMenu.forEachIndexed{idx,menu ->
println("${idx + 1}. ${menu.name} : ${menu.price}")
}
}
- Lv3에 안내된 내용을 보면, 메인에서 하나의 리스트에 모든 메뉴들을 관리할 수 있도록 구현하도록 과제가 주어졌다.
- 하나.. 라고 봐도 되는지 싶긴 하지만, 일단 전체 메뉴를 확인하는 allMenusList는 메인에서 화면을 보여줄 때 사용하는 것이므로 따로 빼놓고 보고,
- detailedMenu 리스트를 만들어서 생성해 둔 burgerList와 mcCafeList를 담아주었다. 둘다 Menu클래스를 상속받기 때문에, detailedMenu에서도 리스트Menu로 제한을 두었다.
- 메뉴리스트를 설정했으면, 그 밑에서부터는 키오스크의 메인 화면이 출력되도록 작성했다. 먼저 allMenusLists의 내용물을 반복문을 통해 보여주면, selectAllMenu를 통해 InputNumber클래스에 만들어 놓은 예외처리 readline()을 받아서 번호를 선택하고 (메뉴 선택 외에 부가적인 종료 등의 기능을 위해 0번을 사용해서, 인덱스 번호와 원하는 기능이 똑같이 맞춰지게 만들어놓았다.) 선택한 번호에 맞는 다음 행동을 when을 통해 제어했다.
- 상세 페이지 이동 안내를 위해 allMenusList의 키값들을 리스트로 묶어서 그 리스트의 인덱스에 해당하는 값이 출력되도록 idxKey를 설정해 주었다.
- 0번은 주문은 Order클래스의 주문옵션으로 넘어간다. break는.. order.orderOption()에서 종료로 break를 넣었더니, 종료가 안되고 다시 메인페이지로 돌아와지길래, break를 한번 더 써서 종료되게 만들었다.. 내일 고쳐야할 부분.
- 1번과 2번은 각 메뉴의 리스트들을 인자로 받는 detailedDisplay를 통해 반복문으로 담긴 내용들을 출력하게 만들었다. 1번부터 메뉴가 나올수 있도록 인덱스에 +1을 해서 모양을 냈다.
- 반복문으로 상세 메뉴들을 확인하면, 각 메뉴에 맞는 번호들을 받도록 selectBurgerMenu 등으로 readline을 받게 했고, 그렇게 고른 번호를 활용하여 Order클래스의 order가 menu를 받을 수있게 만들어주었다.
📖Lv3 문제 발생 및 해결
- 지금 TIL을 작성하면서 생각해보니까, 굳이 메인화면에서 while을 했어야했나? 하는 생각이 든다. 저것때문에 솔직히 뭣만 하면 메인의 while문이 반복되었다. 오직 메인화면의 0번을 누른 다음 q를 선택해야만 종료가 될 수 있는 무한 반복문.. 에 대해 내일 해결해보려고 했는데, while문 남발한걸 좀 고쳐봐야겠다.
- 느낀점에 가까운 말이지만, 구색과 모양만 흉내냈지 기능을.. 한다고 볼 수 있는지는 의문이다. ㅎ 코드 자체가 다.. 문제일지도..ㅎㅎ
📖Lv3 내일 해야할 일
- 위에도 적어놓긴 했지만 어쨋든 모양만 겨우 낸거라서, lv4에서 장바구니 기능을 직접 구현하려고 하면 어디까지 고치고 어디까지 냅둬야하는지 내일 정리해야겠다.
- 벌써.. 내일이 금요일이라서 제출.. 당일이 왔는데.. 오늘 팀원들과 깃허브로 각자 만든 코드를 올리는 것 까지는 했다. 그리고 취합하는 건.. 일단 팀장님이 내일 보신다고 하셨는데, 솔직히 각자 만들어서... 연결도.. 가지각색이라 어떻게 합쳐야할지..? 나는 모르겠다. 팀장님의 의견을 들어보고, 내가.. 도움이 될 일에 적극적으로 도와드린 후! 정오에 과제 제출은 필수. 내일도 화이팅이다!