빠르게 실패하기 VS 안전하게 천천히 실패하기
- 개발자의 입장에서는 빠르게 실패하기가 좋다
- 하지만 유저의 입장에선 데이터가 날라가기 때문에 좋지 않다
- 따라서 빠르게 실패하되 유저의 데이터가 복구될 수 있는 방법으로 가는 방향도 좋고 좋은 기준을 스스로 세우는 것이 중요
- 레아는 빠르게 실패하자 주의
- why? 새로 들어오는 신입 개발자는 앱 내의 데이터를 잘 인지하지 못함. 이럴 땐 빠르게 실패하면 그 혼동을 빠르게 줄일 수 있어 좋다고 생각
Applicaiton과 Activity

LocalDate / LocalTime / LocalDateTime
java.util.Date
은 변경 가능하므로 적절하지 않다.
- JDK 1.8 이후에는
java.time
패키지를 사용 권장
Serializable vs Parcelable
- 직렬화 가능 인터페이스
- Parcelable이 속도가 조금 더 빠름
- 왜 빠른지 내부 구현은 공부 좀 더 해보길
- Parcelable은 안드로이드 의존성이 있음
- 단위 테스트에서 안드로이드 의존성이 있다면 test가 아니라 android test에서 진행되게 된다.
- Parcelable은 코드 작성량이 많아진다
- @Parcelize를 붙이면 편하게 Parcelable를 구현할 수 있다.
- https://developer.android.com/kotlin/parcelize#kts 참고
ListView 아이템 클릭 감지
listView.setOnItemClickListener { _, _, position, _ ->
// ...
}
View 크기 단위
- 뷰 사이의 간격을 지정할 땐 dp
- 텍스트 크기를 지정할 땐 sp
- 크기를 조절할 때 원하는 크기로 조절이 되도록 만들어야 한다.
화면 회전 시 데이터 유지
- 왜 화면이 회전되었을 때 데이터가 날라갈까?
- 앱이 destroy() 되고 다시 실행되는 과정을 거치기 때문
- 구성 변경이 일어나면 안드로이드 액티비티가 재생성되는 과정을 거침
안드로이드 개발을 할 때는 공식 문서를 활용하는 습관을 키워라!!!!!!!!!
효율적으로 복잡한 UI 그리기
- 장풍쏘게 되면 UI의 응답성이 떨어지고 성능이 저하됨
- View LifeCycle과 연관지어 생각해보자!!!!
- layout inspector 에서 메모리를 확인할 수 있음
라이브 코딩
- 뷰의 비율을 조절한다거나 간격을 맞춰 조절하기를 원할 때
constraintDimesionRatie = 0.7
이렇게 이 특성을 사용해 비율을 조절한다.
- id가 +가 붙은것도 있고 아닌 것도 있음. 아이디를 선언할 때를 보면 +는 아이디를 추가한다는 뜻이다. 그래서 레퍼런스 부분에서는 +를 뗴줘도 됨
- 포스터의 높이를 고정하지 않으면 sp와 dp와의 차이때문에 생기는 뷰의 오차를 해결할 수 있다.
- tools : 프리뷰에서 렌더링 할 때만 데이터를 확인 가능
리스트뷰
- 3가지 필수 요소: view, item, Adapter
- 어댑터 getView에서 viewHolder을 쓰면 부드러운 스크롤링 가능
- SupperssLint("ViewHolder")를 getView위에 닮
- string resource를 사용하는 이유는 글로벌 앱이 되었을 때 분기를 칠 수 있도록 사용하는 것
- 어댑터에 context를 넘겨줄 필요 X, 뷰나 parent의 context를 가져오면 됨.
- @DrawableRes : 드러블 리소스 값을 갖고 있는 자료형이라는 표시
더 나은 ListView 만드는 방법
fun getView(position: Int, convertView: View?, parent........){
/*...*/
val viewHolder: ViewHolder
val view = if(convertView != null){
convertView.also { viewHolder = it.tag as viewholder }
//tag를 사용하지 않아도 뷰홀더 저장가능, 하나의 방법일 뿐
} else {
val view - LayoutInflater
.from(context)
.inflate(R.layout.movie_item, parent, false)
viewHolder = ViewHolder(view.findViewById(R.id.title))
view.tag = viewHolder
view
}
}
class ViewHolder(
val title: TextView
)
- 리스너 연결이 중복 호출되지 않게 하게(숙제)
- position을 이용해 어댑터 바깥에서 리스너 연결이 되도록 수정