Android/공부
data class 디컴파일
data class 디컴파일
2025.04.27배경최근에 팀원분이 버그를 해결해서 pr을 올려주셨다.기존 코드는 equals 메서드를 직접 오버라이드 해서 일부 필드만 비교하는 형태였는데 모든 필드를 비교하도록 수정해주셨다. 정상 동작은 확인했으나 "data class에서 자동으로 오버라이드해주는 equals로는 해결 안 되나?"라는 생각이 들었다.자동 제공을 해주는 것만 알았지 구체적으로 어떻게 동작하는지까진 확인을 해본 적이 없었다. 결론그래서 직접 디컴파일을 해봤는데 data class는 모든 필드에 대해 동등성을 비교하는 방식으로 동작하고 있었다.이 점을 리뷰로 남겼고, 역할이 겹치므로 수정해주셨던 코드를 삭제하는 방향으로 개선을 해냈다. 추가로 hashCode에 대한 오버라이드 코드도 삭제도 같이 해주셨는데, 검색을 해보니 그 이유는 h..
컴포즈 - 1장 컴포즈 앱 첫 빌드
컴포즈 - 1장 컴포즈 앱 첫 빌드
2025.01.19Row() 함수는 modifier라는 매개변수를 받는다. modifier는 젯팩 컴포즈의 핵심 기술로 컴포저블 함수의 외형과 행위에 영향을 준다. 3장에서 자세히 다룬다. Recomposition : 컴포저블 함수를 다시 그리는 것. MutableState 타입의 값을 변경하면 컴포저블 함수는 다시 그려지거나 다시 채색된다. Box()는 한 개 이상의 자식 컴포저블 함수를 포함할 수 있다. remember, mutableStateOf는 모두 상태를 생성하고 관리하는 데 매우 중요한 역할을 한다. 컴포저블 함수가 상태를 갖는다면 상태가 변경될 경우 컴포저블 함수는 재구성된다. mutableStatesStateOf()를 사용해 상태를 생성하고 remember를 사용해 상태를 기억한다. 그리고 상태를 다른 ..
Fragment에선 왜 viewLifecycleOwner를 써야할까
Fragment에선 왜 viewLifecycleOwner를 써야할까
2024.09.08안드로이드 처음 시작했을 때 이 그림을 보고는 "Activity처럼 Fragment도 생명주기가 있다는 내용이구나"하고 넘겼었다. 제대로 안 본 것이다. 다시 봐보니 Fragment와 별개로 View의 Lifecycle이 존재한다는 것을 알았다. 보통 fragment를 쓰면 onDestroy 부분에 binding 객체를 null로 하여 참조를 제거해주는 코드를 베이스로 많이 쓴다. 이걸 왜 해주는지안다면 viewLifecycle도 모를 수가 없었을 텐데. 결론부터 얘기하자면 뷰의 수명이 fragment보다 짧기 때문이다. 따라서 뷰는 죽어있는데 fragment는 살아있는 경우가 있을 수 있다. 이때 죽어있는 뷰에 대한 참조를 계속 가지고 있으면 GC가 메모리 회수를 못해서 메모리 leak이 일어난다. ..
retrofit의 비동기 처리
retrofit의 비동기 처리
2024.04.29학습 배경최근 네트워크 쪽 코드 구조를 잡아보면서 여러 문제 상황을 마주했는데 동작 원리를 잘 모르다보니 해결 방향성을 잘 못 잡겠어서 공부의 필요성을 느꼈다. 유의미한 학습 내용을 정리해보고자 한다. 정리 내용retrofit은 okhttp에서 제공하는 enqueue 메서드를 사용한다. enqueue 메서드를 까보면 ExecutorService를 사용하는데 코루틴과 독립적인 스레드 풀을 구성한다. ExecutorService란 스레드를 매번 새로 생성하는 것이 아닌 재사용 가능한 형태로 관리함으로써 리소스를 효율적으로 사용할 수 있게 도와주는 API이다. 코루틴은 내부적으로 같은 enqueue 메서드를 활용하기 때문에 네트워크 비동기 요청을 할 때 Dispatcher를 지정해줘도 실질적으로는 (스레드 ..
Flow
Flow
2024.03.14개요예전에도 flow 공부를 잠깐 했었는데 그때는 이게 왜 필요한지 모르니까 내용이 눈에 잘 안 들어왔고 "LiveData만으로도 충분한 것 같은데 이걸 써야할까?"라는 생각에 활용을 적극적으로 하진 않았다. 써보긴 했지만 "한 번 써보기나 할까?"였고 이게 유용하게 쓰일 수 있는 배경을 모르니 의미없는 작업이었다. 그러다 최근에 회사에서 flow를 배울 필요성을 느꼈다. 그래서 다시 찾아보게됐다. 배경근본적인 문제는 그동안 activity 재성성에 대한 고려가 별로 없이 개발을 해왔다는 것이다. 안정성 측면에서 엉망으로 해왔단 얘기다. 화면을 돌리거나 다크모드를 키면 화면 data가 날아가거나 onCreate() 안에 넣어놓은 logic이 싹 다시 돌면서 의도하지 않은 상황이 생기곤 했다. 같은 맥락..
Repository의 효용에 대한 고찰
Repository의 효용에 대한 고찰
2023.03.16개요data source가 remote인지 local인지 구분할 필요 없게 해준다는 게 어떤 효용인 건지 체감을 잘 못했다.그런데 어제 책을 통해 캡슐화에 대해 조금 이해하게 되면서 그 의미를 얼핏 알 것만 같다. Presentation Layer에서 분리클린 아키텍쳐에서는 Layer를 Presentation - Domain - Data 이렇게 3 단계로 나누어야 한다. 레트로핏 코드는 Activity나 Fragment와 같은 View에 바로 작성하거나 ViewModel에 작성을 할 수도 있다. 어느쪽이든 Presentation Layer에 포함되는 것이다. 그런데 이렇게 할 경우 data는 Data Layer에서 다뤄져야 하는데 Presentation Layer에 포함되므로 올바르게 분리되지 못한 ..