본문 바로가기

Kotlin

(26)
[배달의민족2] 클론코딩 - 4. 약관 상세 화면(Domain 레이어) 안녕하세요! 허접 샴푸입니다. 이번 편은 약관 상세 화면입니다. 글이 매우 길어지는 것 같아 Domain 레이어에 대해서만 먼저 설명하도록 하겠습니다. [만들고자 하는 화면] 1. 이용약관 화면 2. 과거 약관을 선택할 수 있는 하단 팝업 화면 [필요 사전 지식] 1. 안드로이드 2. 코틀린 * 일단 사전 지식이 없더라도 따라 만들면서 부족한 점은, 인터넷 찾아보면서, 학습하시면 됩니다. [내용] 1. ViewModel, ViewModelFactory 2. MVVM, MVI 디자인 패턴 3. ViewPager2 4. UI (Event + State), State Pattern 5. Flow, Observable Pattern 6. Fragment간 통신 7. Clean Architecture, Andro..
[배달의민족2] 클론코딩 - 3. 약관 상세 화면(Data 레이어) ㄹ안녕하세요! 허접 샴푸입니다. 이번 편은 약관 상세 화면입니다. 글이 매우 길어지는 것같아 Data 레이어에 대해서만 먼저 설명하도록 하겠습니다. [만들고자 하는 화면] 1. 이용약관 화면 2. 과거 약관을 선택할 수 있는 하단 팝업 화면 [필요 사전 지식] 1. 안드로이드 2. 코틀린 * 일단 사전 지식이 없더라도 따라 만들면서 부족한 점은, 인터넷 찾아보면서, 학습하시면 됩니다. [내용] 1. ViewModel, ViewModelFactory 2. MVVM, MVI 디자인 패턴 3. ViewPager2 4. UI (Event + State), State Pattern 5. Flow, Observable Pattern 6. Fragment간 통신 7. Clean Architecture, Android..
[배달의민족2] 클론코딩 - 2. 약관 동의 화면 안녕하세요! 허접 샴푸입니다. 이번 편은 먼저 약관 동의 화면입니다. [만들고자 하는 화면] 1. 권한 동의 화면 2. 이용약관 화면(일부 설정만) [필요 사전 지식] 1. 안드로이드 2. 코틀린 3. ViewBinding * 일단 사전 지식이 없더라도 따라 만들면서 부족한 점은, 인터넷 찾아보면서, 학습하시면 됩니다. [내용] 1. ViewModel 2. MVVM, MVI 디자인 패턴 3. ViewPager 4. UI (Event + State), State Pattern 5. Flow, Observable Pattern [시작] 그림, 색상 등과 관련한 리소스 관련 파일은 모두 맨 아래 나와있는 Github에서 확인할 수 있으니 따로 설명을 넣지 않았습니다. 1) 패키지 스트럭쳐 수정 - 기존 ui ..
[배달의민족2] 클론코딩 - 1. 스플래시 화면 안녕하세요! 허접 샴푸입니다. 오랜만에 다시 시작하고자 합니다. 처음부터 끝까지 한번 제대로 만들어보도록 하겠습니다. 이번 편은 먼저 스플래시 화면과 권한 체크를 하는 화면입니다. [만들고자 하는 화면] 1. 인트로 화면 2. 권한 동의 여부 다이얼로그 3. 권한 체크 팝업 [필요 사전 지식] 1. 안드로이드 2. 코틀린 3. Android Jetpack 4. 코루틴 * 일단 사전 지식이 없더라도 따라 만들면서 부족한 점은, 인터넷 찾아보면서, 학습하시면 됩니다. [목표] 1. Fragment 및 ResultListener 2. Jetpack Navigation 3. Permission check [시작] 1) Gradle 설정 - build.gradle (Module: app)에 위와 같이 ViewMo..
[Coroutines 마스터] Coroutine Cancellation 상세 처리 안녕하세요! 허접 샴푸입니다. 오늘은 Coroutine Cancellation 처리에 대해서 자세하게 다루어 볼까 합니다. [문제점] 전 포스트에서, job.cancel()을 통해 실행 중인 Coroutine을 취소하였는 데 취소된 상태로 화면이 남아있었습니다. 취소가 되었다면 다시 실행이 가능토록 해야 하는 데 말이죠. 그렇다고 job.cancel() 이후에 onStop() 오버라이드 함수 내에서 Button을 다시 Enabled 하고, TextView를 다시 세팅한다는 것이 가독성도 떨어지고 유지보수에도 매우 힘들 것으로 판단됩니다. 그럼 어떻게 처리해야 할까요? 방법은 다양하겠지만 제가 생각하는 좋은 방법을 말씀드리도록 하겠습니다. [개요] Coroutine의 경우 실행 중인 Coroutine이 취..
[Coroutines 마스터] Coroutine Cancellation 기초 안녕하세요! 허접샴푸입니다. 오늘은 Coroutine Cancellation에 대해서 매우 짧고 간단한 글을 작성해볼까 합니다. [질문] 돌고 있는 Coroutine을 어떻게 취소시킬 수 있을까요? - 예제를 같이 봐봅시다. [코드] 이전 포스트와 같은 코드이며, 단순히 runTime() 함수 내에서 실행이 끝나면 Toast를 띄우도록 하였습니다. [실행화면] [문제점] 위 실행화면을 보면, 홈 버튼을 클릭하여 바탕화면으로 이동을 하였음에도 불구하고, 앱 내의 Toast가 띄워집니다. 이러면 Ux적으로 문제겠죠? 홈 화면으로 화면 전환을 하였으면 해당 작업은 취소가 되어서 Toast가 띄워지면 안 되는데 말이죠. [방향] 이를 해결하기 위해 Coroutine을 Cancel 해보도록 합시다. 물론, Cor..
[Coroutines 마스터] 흔히 하기 쉬운 실수(CountDown Timer) 안녕하세요! Coroutine을 사용할 때 있어서 흔히 하기 쉬운 실수에 대해서 예제와 함께 설명드리도록 하겠습니다. [예제 화면] 단순하게 TextView 2개, Button 1개로 화면을 구성해보았습니다. 아래 코드를 보면 알겠지만, Button을 클릭하면 5초 동안 타이머를 TextView에 (남은 초) 보여주며 타이머가 끝나면 "Ended" 문구를 다른 TextView에 출력합니다. [코드] Dispatchers.Main.immediate을 사용하였으며 runTime()이라는 suspend 함수를 만들어, seconds가 0이 될 때까지 1씩 차감하여 화면에 남은 초를 출력합니다. [실행화면] 무언가 이상하지 않나요? 전 포스트에서 Dispatchers.Main.immediate을 사용하면 순서가..
[Coroutines 마스터] Dispatchers.Main vs Dispatchers.Main.immediate 안녕하세요~! 오랜만에 다시 돌아왔습니다. 부연 설명 없이 단순 명료하게 글을 작성하도록 하겠습니다. Coroutine을 사용할 때 Dispatchers.Main과 Dispatchers.Main.immediate의 차이는 무엇일까요? 매우 간단합니다. 아래 예제를 봅시다. 1) Dispatchers.Main 을 사용할 시 [결과] testDispatchersMain() 함수를 호출하면, 결과는 아래와 같이 나옵니다. 일반적으로 코드는 Top-Down 방식으로 진행이 되죠. 그래서 위 코드를 보면, 예상된 결과는 Zero -> First -> Second 일 것입니다. 하지만 Zero -> Second -> First가 출력되었습니다. 2) Dispatchers.Main.immediate을 사용할 시 [결..