2023. 12. 19. 20:11ㆍTIL
오늘은 이미 내야할 설문을 어제 제출해놨기에 남는시간에 피드백을 반영해서 코딩해보고있었다.
내가 잘한 부분
1. 일단 구현을 했다는 것
2. 클래스관의 상속관계는 어느정도 이해를 하고있다는 것
내가 못한 부분
1. 객체지향코딩이 일부분 있지만 결국엔 절차지향으로 코드가 1900줄이 넘어가버린 것
2. 코드가 길어지고 반복되는 게 많아서 수정, 변경 등이 어려운 것
실천한 부분
1. 예외 처리
일단 나는 예외처리를 하려고
readln() 아래쪽에 전부
if (!해당변수이름.isNumeric()) {
System.err.println("메뉴 입력은 숫자만 가능합니다")
continue
}
이런식으로 전부 붙여놨었다.
하지만 이를
fun getPureNumber(): Int {
var userInput: String?
var number: Int?
while(true){
println("번호 입력\n")
userInput = readLine()
number = userInput?.toIntOrNull()
if(number != null) {
return number
} else {
println("올바른 숫자를 입력해주세요")
}
}
}
이런식으로 하나의 메소드를 만들고서
변수에다가
var 변수이름 = getPureNumber() 이런식으로 간단하게 줄일수 있었다.
2. 메뉴표시
원래 코드
println("[BURGURKING MENU]\n"
+ "1. Whopper | 순 쇠고기 패티에 싱싱한 야채가 가득~\n"
+ "2. Chicken burger | 에그번과 고소한 소스, 치킨패티의 만남! \n"
+ "3. Side | 신선한 재료만을 엄선해서 버거킹만의 비법으로 바삭하게!\n"
+ "4. Drink | 탄산으로 더 짜릿하게!\n"
+ "5. 장바구니 | 장바구니 확인하기\n"
+ "0. 시작화면으로 |\n")
매번 메뉴를 표시할때마다 직접 println으로 일일히 써주었다.
제품 세부사항도 마찬가지
하지만 이를
val menus: MutableList<MainMenus> = ArrayList()
val foods: MutableList<BurgerkingFood> = ArrayList()
val orders: MutableList<Order> = ArrayList()
이런식으로 리스트를 하나 만들고,
fun init() {
money = 100.0
menus.add(MainMenus("WHOPPERS","버거킹의 대표 메뉴"))
menus.add(MainMenus("SIDE","신선한 재료와 버거킹만의 비법으로 바삭한!"))
menus.add(MainMenus("DRINK","탄산으로 짜릿하게 즐기세요!"))
menus.add(MainMenus("Order", "장바구니를 확인 후 주문합니다."))
menus.add(MainMenus("Cancel", "진행중인 주문을 취소합니다."))
foods.add(BurgerkingFood("Whopper", "버거킹의 대표 메뉴 쇠고기패티 와퍼!", 8.0, "WHOPPERS"))
foods.add(BurgerkingFood("Bulgogi Whopper", "불맛 가득 쇠고기 패티가 들어간 와퍼에 달콤한 불고기 소스까지!", 8.0, "WHOPPERS"))
foods.add(BurgerkingFood("Monster Whopper", "기본재료에 치킨패티, 베이컨, 화끈한 디아블로 소스를 더한 와퍼!", 9.9, "WHOPPERS"))
foods.add(BurgerkingFood("Fried potato", "세계최고의 감자만 엄선하여 바삭하게!", 2.5, "SIDE"))
foods.add(BurgerkingFood("Onion ring", "튀긴 양파", 2.5, "SIDE"))
foods.add(BurgerkingFood("Cheese stick", "튀긴 치즈", 2.5, "SIDE"))
foods.add(BurgerkingFood("Coca cola", "햄버거와 감자튀김의 절친 코카콜라!", 1.6, "DRINK"))
foods.add(BurgerkingFood("Sprite", "스프라이트", 1.6, "DRINK"))
foods.add(BurgerkingFood("Armand de Brignac", "아르망디 샴페인", 999.99, "DRINK"))
}
이렇게 리스트안에다 메뉴를 추가해주고,
fun displayMainmenus() {
println("[ BURGERKING MENU ]")
val maxNameLength = menus.maxOfOrNull { it.name.length } ?: 0
for (i in 1..menus.size) {
val menu = menus[i - 1]
val name = menu.name
var desc = menu.description
if (name == "Order") println("[ ORDER MENU ]")
val padding = " ".repeat(maxNameLength - name.length)
println("$i. $name$padding | $desc ")
}
}
이렇게 불러와주면서 메뉴의 수정, 변경이 훨~씬 편해졌다.
3. 결제창
내가 제작한방식은 모든 제품(대략 16개)마다 결제창이 뜨도록 코드를 복사, 붙여넣기를 하는바람에 절차지향방식이 됐다.
when (purchase.toInt()) {
1 -> { //결제
var mon = money - cost
if (mon >= 0) {
var basket = " ${w.name} | ${w.price} | "
for(i in 1..3) {
println(".")
runBlocking {
launch {
delay(800)
}
}
}
basketlist.add(basket)
println("장바구니에 ${w.name} 추가 완료!\n"
+ "추가로 담을수 있는 금액은 ${mon}원 입니다. 감사합니다.\n")
continue
} else {
cost -= w.price
println("잔액이 부족합니다.")
}
continue
}
0 -> {
continue
}
}
이런게 16개정도 있다고 생각하면.. 1900줄이 되는것도 납득이 된다.
하지만 이를
하나의 메소드로 만들고 해당 제품을 골랐을때 제품의 정보만 쏙 빼가서 만들어둔 결제창에 덮어씌우는 형식으로 바꾼다면?
fun addOrder(food: BurgerkingFood) {
food.displayInfo()
println("위 메뉴를 장바구니에 추가하시겠습니까?")
println("1. 확인\t\t 2. 취소")
while (true) {
var addOrderNumber = getPureNumber()
when (addOrderNumber) {
1 -> {
orders.add(Order(food))
println("장바구니에 추가가 완료되었습니다.")
return
}
2 -> {
println("구매를 취소했습니다.")
return
}
else -> {
println("올바른 숫자를 입력해주세요")
}
}
}
}
(위에서 메뉴, 음식 리스트를 만들때 같이 만들어둔 오더리스트에 추가하는 방식으로 바뀌었다.)
대강 이 3개가 가장 큰 변화인것 같다.
오늘의 한마디 : 일단은 좀더 따라쳐서 익숙해져야겠다.
'TIL' 카테고리의 다른 글
20231221 (목) CourseRegistration 만들기 (1) | 2023.12.21 |
---|---|
20231220 (수) 스프링 TIL (1) | 2023.12.20 |
20231218 (월) 스프링 입문 시작 + 저번주차 과제물 피드백 반영 (1) | 2023.12.18 |
20231214 (금) 키오스크 프로젝트 제출 및 코딩공부 (1) | 2023.12.15 |
20231214 (목) 키오스크 프로젝트 마무리 (0) | 2023.12.14 |