이번에도 진행하면서 알게된 것들을 적어놓으려고 한다.
1. 정수 판별
어제는 이 부분을 함수를 만들어서 판별했는데 오늘 팀원이 알려준 toIntOrNull 함수로 간단하게 판별할 수 있게 되었다.
?: 연산자까지 넣으니까 when에서 아주 좋았다.
문자를 넣든, 범위를 넣는 값이 들어오든 다 else에서 처리가 되기 때문이다.
val check = readln()
when (check.toIntOrNull() ?: -1) {
1 -> {
orderReceipt.addMenu(chickenInfo[selectedChicken.toInt() - 1])
println("${chickenInfo[selectedChicken.toInt() - 1].name}가 장바구니에 추가되었습니다.\n")
break
}
2 -> {
println("처음화면으로 돌아갑니다.\n")
break
}
else -> {
println("잘못된 입력입니다 다시 입력해주세요.")
}
}
2. constructor
객체를 리스트에 추가할 때 생겼던 문제로 인해서 사용하게 되었다가 이것도 팀원의 해결책으로 나도 해결이 되어서 사용하지 않게 된 부분이다.
constructor가 왜 필요한가 싶었지만 막상 필요한 경우에 써보니 좋았다.
클래스 파라미터를 다양하게 지정할 수 있는게 필요했는데 이게 딱 그거였다.
constructor() {
orderReceipt = mutableListOf()
sum = 0
}
constructor(orderReceipt: MutableList<Order>, totalSum: Int) {
this.orderReceipt = orderReceipt
this.sum = totalSum
}
이번에는 미사용으로 지나갔지만 다음에는 내 기억 속에 남아 있으니 필요할 때 쓰게 될 것이다...
3. runBlocking
현재 Thread 작업이 완료될때까지 Blocking 해주는 runBlocking
sleep과 비슷하다고 하지만 runBlocking은 CoroutineScope 중 하나이기 때문에 그 안에 여러개의 쓰레드를 생성할 수 있다.
물론 나는 그런 용도로 쓰지는 않았다.
runBlocking {
GlobalScope.launch {
delay(3000)
}.join()
}
4. 객체를 리스트에 추가하는 경우
클래스 객체를 리스트에 추가했는데... 추가했는데!! 값이 원하는 대로 나오지 않아 이곳 저곳 출력문을 넣어가며 확인했더니 추가한 클래스 객체의 값을 변경시켰을 때 리스트도 영향을 받았다는 걸 알게 되었다.
어째서인가 어째서인가 하며 다른 방식으로 해결했지만(2번) 이후에 팀원의 도움으로 객체가 참조타입으로 넘어가서 그런 거 같다고 했을 때 아하! 하며 원래 하려던 방식으로 해결할 수 있었다.
// 클래스 객체를 리스트에 추가
proceedingOrderList.add(orderReceipt)
// 클래스 객체를 clear하는 것이 아니라 새로운 객체로 초기화
orderReceipt = OrderReceipt()
5. LocalTime
LocalDateTime과 뭐가 다르겠냐 하고 그냥 섞어서 썼다가 바로 에러를 맞고 천천히 검색해서 해결했다.
LocalDateTime은 LocalDate와 LocalTime이 합쳐진 것으로 보인다.
물론 포매팅할 때는 DateTimeFormatter.ofPattern을 사용한다.
LocalTime은 시,분,초를 다룰 수 있는 것이다.
파싱을 원한다면 HH:mm:ss 형태의 문자열로 넣으면 기본적인 파싱이 된다.
포매팅은 위에서 말한 걸로 하면 된다.
isAfter, isBefore 함수를 쓸 수 있는 건 아주 좋았다.
fun checkInspectionTime(): Boolean {
val curTime = LocalTime.now()
val startInspectionTime = LocalTime.parse("11:10:00")
val endInspectionTime = LocalTime.parse("11:20:00")
println("현재 시각은 ${curTime.format(DateTimeFormatter.ofPattern("HH시 mm분"))}입니다. ")
return curTime.isAfter(startInspectionTime) && curTime.isBefore(endInspectionTime)
}
6. GlobalScope.launch
Coroutine을 실행하는 가장 기본적인 방법이 GlobalScope
GlobalScope.launch()를 하면 Job 타입을 리턴하는데 Job 타입은 백그라운드 작업을 의미한다.
GlobalScope 안에 delay를 쓰는 경우 해당 스레드만 멈추게 하고 다른 스레드는 정상 작동한다.
launch는 매개변수로 Dispather를 받을 수 있는데 Dispatchers.Main, Dispatchers.IO, Dispatchers.Default, Dispatchers.Unconfined 4종류가 있다.
활용처가 좀 다르다.
GlobalScope.launch(Dispatchers.Default) {
while (true) {
delay(5000)
if (proceedingOrderList.isNotEmpty()) println("(현재 주문 대기수 : ${proceedingOrderList.size})")
else println("(현재 주문 대기수 : 0)")
}
}
'Kotlin > StoreInfo' 카테고리의 다른 글
<정리> lateinit vs by lazy (0) | 2023.12.18 |
---|---|
<정리> 키오스크 프로그램 구현2 (0) | 2023.12.08 |
<정리> 호텔 예약 프로그램 구현 (2) | 2023.12.05 |
<정리> 계산기 구현 (0) | 2023.11.30 |
<강의> Kotlin 문법 종합반 5주차 (0) | 2023.11.30 |