-
2번째 키오스크 과제Android 2024. 3. 24. 23:56
1. 람다식에 대해서는 아직 딥다이브 할 필요는 없습니다! 굳이 람다식을 안써도 구현할 수 있는 방법이 거진 다 있으며, 그런 것들이 충족되면 추후 람다식을 더 활용해보면 좋지 않을까 생각듭니다. 그러니 좌절하지 마세요!
2. warning (노란 줄, 노란 음영) 뜨는 부분을 넘어가지 말기 → alt + enter 나 alt + shift + enter 로 해결하기
3. val option: Int = (readlnOrNull() ?: "0").toInt() 아니면 val option = readln().toInt()
4. Basket이 싱글턴이라면 basket이나 requireMoney와 같은 멤버필드를 외부에서 바꾸지 못하게 해주세요. setter을 만들어서 해주는 연습을 해주면 좋을 것 같습니다. 물론 싱글턴이라서 그렇다기보다는 Encapsulation을 위해서 외부에서 내부 변수를 마음대로 수정하면 안되며 수정이 필요할시 항상 setter로 하는 것이 좋습니다. (private)
object Basket { // Encapsulation을 위한 private visibility modifier 사용 private val basket = mutableListOf<String>() // 콜렉션 활용 private var requireMoney: Int = 0 // 멤버 변수는 항상 Setter(함수)를 아래와 같이 만들어서 변경한다. fun subtractPrice(price: Int){ this.requireMoney -= price } }
5. Food를 상속받는 각각의 아이템을 또 상속하여 세분화하면 좋을 것 같습니다
starUML 로 작성한 구성도 16:00~18:00 저번주 과제 고치기
피드백을 통해 변화된점
음식 class마다 basket 객체를 원래 각각 생성했었는데 object 선언을 통해 객체를 만들지 않고 바로 접근 가능하다.
1. companion object를 사용하여 인스턴스를 만드는건 Kotlin 방식이 아니다. 클래스 이름 앞에 class 대신 object를 선언하면 된다.
2. Int를 받아올때 null 세이프티를 사용하는법
val opt : Int = (readlnOrNull() ?: "0").toInt() // 방법1 val opt = readln().toInt()
3. Basket이 싱글턴이라면 basket이나 requireMoney 같은 멤버필드를 외부에서 바꾸지 못하게 setter (함수=fun)에서 값을 변경할 수 있도록 선언하자.
Encapsulation을 위해 외부에서 내부 변수를 맘대로 수정하면 안된다!
object Basket { //Encapsulation을 위한 private visibility modifer 사용 private val basket = mutableListOf<String>() private var requireMoney:Int=0 //멤버 변수는 항상 Setter(함수)를 아래와 같이 만들어서 변경한다. (object로 선언해서 더더욱 그렇다) fun substractPrice(price:Int) { this.requireMoney -= price } }
4. 상속관계
오류
Class 'com.example.myAssignment2.MainKt' not found in module '2.app.main'
→ 해결방법 : fun main 이 동작하는 코드에서는 굳이 class 를 쓸 필요가 없다(?) fun main 함수를 class 로 감싸주니까 오류가 떴었따.
오류 발생 또 이렇게 억지로 추상 클래스로부터 객체를 끌고 왔는데 TODO 안에 뭐라도 작성을 안해준 상태에서 실행하면 오류가 발생한다!
lv1
- fun main() 함수안에 모든 로직을 작성하였다.
- while(true) 문으로 전체 코드를 감싸고, 종료때만 루프를 빠져나간다.
- 메뉴를 고르고 거기서 세부메뉴를 선택할 수 있다.
lv1 구조도 lv2
- Food 클래스를 생성하였다.
- while문 밖에 Food 클래스의 객체를 생성한다.
- 세부 메뉴를 사용자로부터 입력받았을때 해당 객체의 클래스의 displayInfo 메소드를 불러온다.
lv2 구조도 lv3
- (삭제된점) 기존 Food 클래스에서 객체를 생성하여 불러오도록 한 것
- Menu 클래스를 생성하고, open 키워드를 통해 부모 클래스로 지정, Food 자식 클래스를 생성함
- Main.kt 에서 main() 함수 밖에 Menu 객체, Food 객체를 담는 리스트 생성, money도 생성
- init() 함수를 생성하여, main 함수 내에서 불러왔을때의 로직 처리 → Menu 객체 및 Food 객체를 생성하고 객체들을 리스트에 담음, money를 100.0 으로 수정
lv3 구조도 val menus: MutableList<Menu> = ArrayList() val foods: MutableList<Food> = ArrayList()
lv4
- Order 클래스가 추가되었다. 특이한 점은, 변수로 food 클래스 객체를 저장한다.
- 메소드가 많이 증가하였다 → main 함수의 코드 내용은 간소화하였다.
- getPureNumber 함수를 이용해 사용자로부터 정수를 받아오는 과정에서 코드의 반복을 줄인 점이 좋다.
- padding 개념을 이용하여 메뉴를 자동적으로 칸을 맞추어 표시하는 부분이 새로웠다.
- (궁금증) while 문을 빠져나갈때 break가 아니라 return을 주로 썼는데 둘이 차이가 무엇일까?
lv4 구조도 lv4.mdj0.06MBselectObject?.let {obj -> addOrder(obj) } ?: run { // 세부메뉴에서 음식을 고르지 않고 뒤로가기를 선택한 경우 println("\n현재 잔액: $money") }
orders.clear()
val totalOrderPrice = orders.fold(0.0) {acc: Double, order: Order -> // fold 함수 정리하기 // acc 초기값 : 0.0 acc + order.food.price }
val maxNameLength = filteredFoods.maxOfOrNull { // "Forzen Custard" 의 길이를 가져옴 it.name.length } ?: 0 val namePadding = " ".repeat(maxNameLength - name.length) println("$idx. $name$namePadding | $ $price$pricePadding | $desc")
fun getPureNumber(): Int { // var categorySelect = getPureNumber() var userInput: String? var number: Int? while (true) { print("번호를 입력해주세요") userInput = readlnOrNull() // alt+shift+enter 로 수정 number = userInput?.toIntOrNull() if (number != null) { return number } else { // null일 경우, 문자를 입력한 경우 println("올바른 숫자를 입력해주세요") } } }
'Android' 카테고리의 다른 글
Activity, Intent (0) 2024.03.28 Layout, Margin, Padding, Gravity (0) 2024.03.27 안드로이드 세번째 과제 (0) 2024.03.23 앱 아키텍처 - 챌린지 과제 (0) 2024.03.22 MVC, MVP, MVVM, MVI (0) 2024.03.19