컴퓨터공부 362

ViewModel에 대한 Insight

1. ViewModel에서 View(Fragment, Acivity)에 직접 접근하거나 제어 해서는 안된다. 2. ViewModel에서 View를 변경하고 싶으면 LiveData나 Callback 혹은 Function Reference를 사용하면 된다. 예를 들어, 특정 View를 보이지 않게 하고 싶으면 "val enableLayoutVisibility = MutableLiveData()" 같은 변수를 사용하여 Observe 패턴으로 Fragment나 Activity에서 제어 하면 된다. 3. 장점 View와 Business logic을 분리 할 수 있으며, 이것은 많은 장점을 갖는다. View는 오직 View의 처리만 담당하므로 보기가 편하다. 이런 관심사의 분리가 발전하여 Compose UI를 탄생..

HashMap은 call by reference를 사용한다.

HashMap의 리턴 값은 call by ref를 사용하기 때문에, 값을 변경하여도 다시 put을 사용하지 않아도 된다. In this example, the StringBuilder object is modified directly after being retrieved from the HashMap, and the changes are reflected in the value stored in the map. Note that you don't need to use the put method again to update the value in the map because you are working with a reference to the same object. public class HashMap..

fragments 에서 view binding을 사용하기 위한 패턴

아래는 google이 보여줬던 기본 패턴이다. 그냥 이것을 바탕으로 살을 붙이면 된다. binding 변수를 사용하는 이유 _binding은 nullable 이라서 매번 _binding?.okButton 같은거 해주기 불편해서이다.(출처) onDestoryView()에서 _binding 에 null을 대입 하는 이유 memory leak 방지 private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: Layo..

SaveInstanceState가 생긴 이유

출처 : https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html 이전 포스팅에서 적었지만 InstanceState로 인하여 IllegalStateException  발생한다. 근데 이게 왜 필요한가? 안드로이드 플랫폼에서 상태를 자동으로 샤샥 저장해 주면 되잖아?? 물론 그렇다. 하지만 현실적인 문제가 있다. 폰의 메모리는 한정적이기 때문에 모두 저장해 주지 못한다. 거기다 플랫폼에서 메모리가 없으면 앱을 죽여 버리기 까지 한다.. 이것에 대한 해결책으로 안드로이드가 제시한 것은, 이전 상태의 정보를 저장하고 앱을 재 실행할 때 복원해 주는 것이다. 그럴듯하고 실제로도 잘 동작한다. 다만 개발자가 ..

Fragment 전환 시 IllegalStateException 원인 및 해결

출처 : https://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html https://proandroiddev.com/kotlin-extensions-to-commit-fragments-safely-de06218a1f4 https://stackoverflow.com/questions/7575921/illegalstateexception-can-not-perform-this-action-after-onsaveinstancestate-wit 원인 Activity의 onSaveInstanceState()가 호출된 후에 FragmentTransaction의 commit()을 동작하는 데에 있습니다. 이건 안드로이드..

observeOn vs subscribeOn

subscribeOn : 현재 Observable가 시작하는 스레드를 지정한다.(지정하지 않을 경우 현재 Observable을 호출하는 스레드를 따라간다.) : 여러번 호출 할 경우 첫번째 것만 사용된다. observeOn : 'observeOn() 구문' 아래에 나올 구문들의 스레드를 지정한다. : .observeOn() 안의 스레드는 ui 스레드나, background 스레드 모두 지정할 수 있다. 일반적인 사용 : subscribeOn()에서 background 스레드(Schedulers.computation(), Schedulers.io()) 를 지정하여 데이터를 모으고, 데이터를 UI에 보여줄 때 observeOn() 을 이용해서 ui 스레드로 변경해서 보여준다. 예시 ) Observable.j..

브랜치 전략(Branch strategy)

전체적으로 Github-flow와 git-flow가 있다.(이름이 참... 허갈리게 되어있다) 상황마다 다르겠지만, 굳이 사용처를 나누자면 아래와 같다. 1개월 이상의 긴 호흡으로 개발하여 주기적으로 배포, QA 및 테스트, hotfix 등 수행할 수 있는 여력이 있는 팀이라면 git-flow가 적합하다 수시로 릴리즈 되어야 할 필요가 있는 서비스를 지속적으로 테스트하고 배포하는 팀이라면 github-flow 와 같은 간단한 work-flow가 적합하다 자세한 그림 같은 건 아래 출처를 참고 하세요. 출처 : https://hyeon9mak.github.io/git-branch-strategy/#:~:text=%EB%B8%8C%EB%9E%9C%EC%B9%98%20%EC%A0%84%EB%9E%B5%EC%9..

컴퓨터공부 2021.08.28

Kotlin에서 변수 깊은 복사(Deep copy) 하기

Gson을 아래와 같이 이용하면 의도적으로 깊은 복사가 가능하다. class Animal{ fun clone(): Animal { val stringAnimal = Gson().toJson(this, Animal::class.java) return Gson().fromJson(stringAnimal, Animal::class.java) } } val originalAnimal = Animal() val clonedAnimal = originalAnimal.clone() 단어. 얕은 복사(shallow copy), 깊은 복사(deep copy) 참고 : https://velog.io/@ellyheetov/Shallow-Copy-VS-Deep-Copy 출처 : https://stackoverflow.com/..