아이템2의 주제: 변수의 스코프를 최소화 하는것이 좋다 스코프란?어떤 요소의 스코프라고 한다면 그 요소를 볼 수 있는 컴퓨터 프로그램 영역이다.변수의 스코프라고 한다면 그 변수를 인식하고 사용할 수 있는 범위를 의미한다.코틀린에서는 기본적으로 {} 중괄호로 스코프를 만든다.상태를 정의할때는 변수와 프로퍼티의 스코프를 최소화 하는 것이 좋다.프로퍼티 보단 지역변수를 사용하는것이 좋다.최대한 좁은 스코프를 갖도록 변수를 사용한다.스코프 범위 좁히기의 예시// 가장 안좋은 방법var user: Userfor(i in users.indices) { user= users[i] print("user at $i is $user")}// 조금 더 좋은 방법for(i in users.indices) { val us..
1장의 주제 : 오류를 덜 일으키는 코드 작성법아이템 1의 주제: 가변성을 제한한 immutable이 좋은 이유, 최대한 변경되는 부분을 제한하자 가변성의 단점- 코틀린은 모듈로 프로그램을 설계한다- 모듈을 이루는 요소: 클래스, 객체, 함수, 타입 별칭 등 - 상태: var, mutableList 처럼 변경 가능한 변수를 사용하게 되면 가지게 됨상태를 가진 요소는 그 상태가 변경되는 이력에 따라 동작이 영향받게된다. (변경된 값을 사용할때와 아닐때의 동작이 달라지기 때문임) - 상태를 가진 요소에서 일어날수있는 리스크들1. 프로그램 이해, 디버그 어려워짐: 상태들의 관계를 이해해야 함, 상태 변경을 추적해야 함, 이해하기 어려운 클래스가된다, 수정하기도 여려워짐, 예상못한 에러를 일으킬 가능성이 높다2..

-제 뇌피셜로 이루어진 글입니다 잘못된점 있으면 알려주세요 ㅠㅠ 어느날.. 이런 메일이 왔다 엄청난 영어로되어있어 챗지피티에게 요약을 부탁했다(영어공부좀 하자) 안녕하세요, Google Play 개발자님, 앞으로의 사용자 데이터 보호를 강화하기 위해, 올해 초에 새로운 계정 삭제 요건을 도입했습니다. 지금은 여러분의 앱이 Data safety 양식에서 적절한 계정 삭제 섹션을 갖추지 않았음을 알려드리고 있습니다. 이는 저희가 알려드린 오류 때문일 수도 있고, 또는 Data safety 양식의 이 섹션이 아직 완성되지 않았을 수도 있습니다. 조치 요구 모든 개발자는 2023년 12월 7일까지 Play Console에서 Data safety 양식을 업데이트해야 합니다. 이로 인해 앱의 Data safety ..

프로젝트를 하던 도중.... 한 launched effect에서 여러개의 flow를 collect 하려고했다 이런식으로 근데 viewModel에서 값이 바뀌는것까지 다 확인을 했는데 저 color changed가 로그가 안찍혔다... 그래서 이렇게 바꾸니깐 color changed가 호출됨 헐; 그래서 찾아보니깐 https://co-zi.medium.com/stateflow-%EB%A5%BC-collect-%ED%95%A0%EB%95%8C%EC%9D%98-%EC%A3%BC%EC%9D%98%ED%95%A0%EC%A0%90-d1826818b773 StateFlow 를 collect 할때의 주의할점 TLDR; StateFlow.collect 는 루프를 사용하기 때문에 다음 코드 진행을 막는다. co-zi.me..

FATAL EXCEPTION: main Process: com.habit, PID: 29808 java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.Number.intValue()' on a null object reference at com.habit.data.repository.datasourceImpl.LocalDataSourceImpl.selectTodaysCalorie(LocalDataSourceImpl.kt:21) at com.habit.data.repository.datasourceImpl.LocalDataSourceImpl$selectTodaysCalorie$1.invokeSuspend(Unknown ..

수면 데이터를 가져오기 위해 엔티티와 모델을 아래처럼 만들었다 보시는바와 같이 아무생각없이 그냥 똑~같이 생겼다 매퍼도 이렇게 했다.. 이럴거면 매퍼를 왜만들지? 하는 생각이 들었다 암튼 이렇게 하고있는데 화면단에서 총 수면시간, 깬 시간, 렘, 가벼운 수면, 깊은수면 이렇게만 데이터를 가져도 된다는것을 알게되었다 이렇게 생긴 화면이었기 때문! 그런데 이렇게만 알면 되는데 헬스커넥트에서 주는 데이터 그대로~~~ 받아서 쓰니 화면단에서 한번 더 처리를 하게되어 지저분한 코드가 되어있었다! @Composable fun SleepBottomSheet( sleepSessionData: MutableList ) { var awake: Duration = Duration.ZERO var rem: Duration =..