전체 글 25

Sealed class + StateFlow

서론 최근들어 저는 LiveData를 사용하지 않고, StateFlow를 이용해 UI Data State holder를 처리하는 편입니다. 그런데, 이러한 방식을 이용해 로딩, 에러, 데이터 성공을 모두 표현하기 위해서는 3개의 변수를 가지고 각각의 State에 따라 collect하고 있는 View들의 Visible처리를 바꿔주는 방식으로 사용하곤 했었습니다. 그러나 회사 코드와 여러 예제들을 보니 하나의 변수를 통해, Sealed class를 이용해 위의 세가지 기능을 한번에 처리해줄 수 있다는 것을 알게됐고, 이제부터 사용방법과 이점을 알아보도록 하겠습니다. private val _movieList = MutableStateFlow(emptyList()) val movieList = _movieLis..

Android 2022.10.09

Jetpack Navigation 총정리 2탄

저번에 이어서 Navigation에 대한 정리를 해보겠습니다~! 이번 포스트에서는 아래와 같은 사항들에 대해서 알아보겠습니다. Nested graphs toolbar(app bar) bottom navigation back stack 관리 Nested graphs Nested graphs란 쉽게 말해서 Navigation Graph 안에 또다른 graph를 연결해주는 것을 뜻합니다. 재사용이 많거나, 다른 그래프와 연결해주거나 할 때 유용하게 사용됩니다. 이러한 Nested graph를 사용하면 그래프들을 캡슐화할 수 있고, 간결하게 보여줄 수 있습니다. 돈을 송금하고, 계좌의 잔액을 확인하는 그래프가 아래와 같이 있다고 가정해봅니다! 여기서 송금할 이름 입력 (fillNameFragment) 와 보낼 ..

Android 2022.09.24

Jetpack Navigation 총정리 1탄

제목에 일부로 총정리라고는 적었지만, 사실 자주 잊어버리는 것에 대해서 정리하기 위해서 작성한 포스트이니, 없는 것에 대해서는 댓글 남겨주시면 공부해서 올려놓겠습니다! 또한 해당 포스트는 Kotlin 버전에 대해서만 작성하며, Java는 작성하지 않습니다! 현재 포스트 정리 목록 - 2022.09.19 Jetpack Navigation은 뭐죠? navController란? navController의 사용법은? safe Args란? 데이터 전달하기 간단한 Global action이란? Jetpack Navigation은 뭐죠? 이전에 fragment 간의 이동에는 fragmentManager를 이용해서 이동하곤 했습니다. 아래와 같이요! parentFragmentManager.commit { replace..

Android 2022.09.19

Retrofit 파헤치기

Retrofit이란? Retrofit의 공식 홈페이지를 보면 이렇게 설명되어 있습니다. Retrofit은 Android 와 Java를 위한 type-safety한 HTTP Client입니다. Retrofit을 이용해 HTTP API를 Java Interface로 변환할 수 있습니다(물론 컨버터도 필요합니다). Retrofit을 이용한 GitHub Api 이용하기 public interface GitHubService { @GET("users/{user}/repos") Call listRepos(@Path("user") String user); } Retrofit class는 Github Interface의 구현을 생성(create)해줍니다. Retrofit retrofit = new Retrofit.Bu..

Android 2022.09.15

Android 알람 만들기 (feat. Service, Broadcast Receiver)

이번 포스트에서는 Broadcast Receiver, Service를 이용해서 알람을 만드는 방법을 알아봅니다! 먼저 알람에 대해서 알아볼텐데요, 안드로이드 developer 사이트에 올라온 set Alarm을 보면, 알람을 설정할 때 몇가지 기준이 필요하다고 합니다. 정확한 시간에 울려야 하는가? vs 정확한 시간이 아니여도 괜찮은가? 반드시 정확한 시간에 울려야하는 알람이 아니라면, setRepeating() 보다는 setInexactRepeating()을 이용합니다! 왜냐하면, 정확한 알람 설정은 부정확한 알람 설정보다 많은 배터리를 소모하기 때문입니다! 지정한 시간에 울려야 하는가? vs 기기를 부팅한 후의 시간을 통해 울려야 하는가? 알람의 유형은 4가지가 있습니다! ELAPSED_REALTIM..

Android 2022.09.15

Drawble Selector를 이용한 Button 만들기

왜 기본 Button이 있는데, Selector? 우리가 일반적으로 사용하는 Button은 다양한 제약을 받으며, 이를 피하기 위해 Custom해서 사용해야 한다. 버튼 또는 이미지가 터치 됐을 때, 터치됐다는 느낌을 주고싶다면, 혹은 한 버튼의 현재 상태에 따른, 예를 들면 포커스 됐을 때, 체크 됐을 때, 선택 되었을 때 등 여러 상태에 따라 커스텀하고 싶을 때 Drawble Selector를 이용해서 만들면 편리하다. Drawble Selector 먼저 Drawble Selector를 이용해 이미지로 버튼을 클릭했을 때, 클릭하지 않았을 때의 이미지를 다르게 만들어보겠다. res/drawable 폴더에 클릭 됐을 때, 클릭이 안됐을 때(true와 false일 때) 이미지를 넣어준다. drawable..

Android 2022.09.14

확장함수와 람다

Kotlin에서는 확장함수, 람다 식, 고차함수를 적절하게 사용하면 코드가 깔끔해지고, 공통 코드 구조를 뽑아낼 수 있다. 확장 함수의 기본 확장 함수는 간단하다! 확장 함수는 어떤 클래스의 멤버 메소드인 것처럼, 즉 원래 클래스 안에 선언되어 있는 것처럼 호출이 가능하지만 사실은 그 클래스 밖에 선언된 함수다. 아주 쉬운 예제로 확인을 해보면, 한 문자열의 가장 마지막 문자를 출력해보는 예제이다. fun String.lastChar(): Char = this.get(this.length - 1) 확장 함수는 일반 함수의 선언처럼 fun 키워드로 시작한다. 이후에 확장할 클래스 이름( 이를 수신 객체 타입이라고 한다 )을 적고 점(.) 뒤에 함수의 이름을 적어주고, 함수 답게! 괄호 ()를 넣어주고, 마..

Kotlin 2022.09.14

LifecycleScope, ViewModelScope의 내부 구조

어느날 안드로이드 개발 단톡방에 이런 글이 올라왔다. CoroutineScope를 이용해 코루틴을 이용할 수 있지만, 위의 사진 처럼 Activity, ViewModel에 따라 각각의 Lifecycle에 맞추어 onCleared()시에 Coroutine의 작업을 취소시켜줄 수 있다. 이처럼 Coroutine의 Scope에는 상황에 맞는 Scope가 있는데, 이중 ViewModelScope, LifecycleScope에 대해서 차근차근 알아보자. 1. LifecycleScope 먼저 모듈수준의 build.gradle에 추가를 해준다. androidx.lifecycle:lifecycle-runtime-ktx:2.2.0 // 또는 그이상의 버전을 사용 LifecycleScope의 선언부이다. 설명을 읽어보면 ..

Android 2022.09.14

AAC ViewModel은 어떻게 onDestroy에서 살아남을 수 있었을까

1. AAC ViewModel이란? AAC ViewModel(이하 ViewModel)은 ViewModelStoreOwner의 수명주기를 인식하며, 화면 회전같은 configuration change에서 데이터가 생존할 수 있도록 해준다. 또한 목적에 따라 ViewModel, onSaveInstanceState, Persistent Storage를 적절히 이용해 데이터를 저장할 수 있도록 한다. 이는 저장소 위치, 시스템에서 프로세스 중단시에도 데이터 유지, 사용자가 액티비티를 완전히 닫거나 finish()등 에서도 데이터가 유지되는지에 따른 차이가 있으니 필요에 맞게 단독 또는 조합하여 사용해야 한다. ViewModel은 onSaveInstanceState나 Persistent Storage와는 다르게 ..

Android 2022.09.14

Kotlin에서의 Delegation Pattern(2) - Delegated Properties

1편에서는 클래스에서 Delegation Pattern을 적용했다면, 이번에는 변수에 Delegation Pattern을 적용하는 방법을 알아보겠습니다. Delegated properties class Xample { var varValue: String by Delegate() val valValue: String by Delegate2() } getValue(), setValue() 이와 같이 변수를 선언한 뒤 자료형 뒤에 by와 함께 클래스를 적어주면, 해당 클래스에서 구현해줄 함수가 생깁니다. var 변수의 경우에는 getValue(), setValue()를 구현해주어야 하고, val 변수에 대해서는 getValue()만 구현해주면 됩니다. import kotlin.reflect.KProperty..

Kotlin 2022.09.13