본문 바로가기

분류 전체보기

(99)
Channel 제대로 알기 Channel 이 왜 필요한가? 채널은 코루틴과 코루틴이 서로 통신하기 위해 필요합니다. 전역 변수 등을 통해서 전달할 수야 있겠지만, 동시성 문제도 고려하여야 합니다. 이를 해결하기 위해 Channel 이 탄생했습니다. 간단한 사용법은 다음과 같습니다. var num = 0 val channel = Channel() findViewById(R.id.textView).setOnClickListener { // textView 클릭시 CoroutineScope(Dispatchers.Default).launch { num++ channel.send(num) // channel 에 num 값 보냄 } } CoroutineScope(Dispatchers.Main).launch { repeat(5) { // 다섯..
StateFlow, SharedFlow 제대로 알기 Flow 는 단일 수신자에게 스트림을 제공하는 일반적인 방식입니다. 그럼, 수신자가 여럿인 경우는 어떻게 하면 좋을까요? StateFlow 와 SharedFlow 는 이러한 상황에 대한 좋은 선택지가 될 수 있습니다. 🤔 얘넨 또 뭐하는 애들인가요? StateFlow 와 SharedFlow 는 상태의 업데이트를 최적화하고, 여러 소비자에게 값을 보낼 수 있도록 하는 Flow API 입니다. 여러 상황에 다이나믹하게 도입할 수 있어, 유연한 스트림 전송을 도와줍니다. StateFlow 수집자에게 현재의 상태와 새로운 상태 업데이트를 방출하는 State-Holder Observable Flow 입니다. State-Holder 라는 것은 상태를 보관할 수 있음을 의미합니다. 시간의 흐름에 따라 달라질 수 있는..
Sealed Class, Enum 제대로 알기 개발을 하다보면 상수 타입에 대한 구분을 두는 것이 필요할 때가 있습니다. 정적 변수 선언을 통해 이를 해결할 수 있으나, 이 마저도 너무 많아지면 메모리에 대한 문제가 생길 수 있기에 좋은 방법은 아닙니다. (물론 소량이라면 괜찮습니다. 여전히 좋은 방식입니다.) 코틀린은 Enum 과 Sealed Class / Interface 를 제공합니다. 단순히 정적 변수를 선언하는 것에 따라 발생할 수 있는 부작용들을 사전에 차단할 수 있는 방안들입니다. 그 중 Sealed Class 는 Enum 과는 엄연히 다른 것이고, 그다지 관계가 없어 보이기까지 할 수 있지만, 상황에 따라 둘을 같은 용도로 사용할 수 있기도 합니다. 직접 개발한 에서, 전적을 살펴볼 수 있는 화면에서는 한 개의 RecyclerView ..
out, in 제대로 알기 코틀린 프로젝트 내에서 이런 저런 함수들을 타고 타고 가다보면, out, in 이 계속 보입니다. 런타임에 데이터 타입을 결정하는 제네릭(Generic) 과 관련이 있어 보입니다. 코틀린의 제네릭은 자바의 그 것과 같지만, out, in 등의 새로운 키워드가 사용됩니다. 제대로 된 사용법을 알아보고 기록하고자 합니다. 코틀린의 클래스, 인터페이스는 타입 인자를 가질 수 있습니다. 자바와 똑같습니다. 다음은 그 구현입니다. class Generic(t: T) { var value = t } Generics 클래스의 인스턴스 생성을 위해, 우리는 타입을 지정하여야 합니다. fun main() { val instance = Generic("Aiming Driven Development") println(ins..
[Glide] Glide 의 Cache Glide 사용하고 계신가요? 안드로이드 개발자들이 가장 사랑하는 이미지 처리 라이브러리입니다. 저 또한 애용 중이며, 많은 분들께서 사용 중이시리라 생각합니다. 수많은 메서드를 통해 이미지 수정 및 처리가 가능하고 Third-Party-Library도 많은 데다가 gif까지 훌륭히 지원하니, 놀랍도록 우수한 라이브러리가 등장하지 않는 이상은 Glide가 다른 라이브러리에게 자리를 내어줄 일은 없어 보입니다. Glide는 기본적인 캐시(Cache)를 지원하고 있습니다. 그럴 수 밖에 없는 것이, 앱 내 리소스에 이미지를 포함시키기에는 너무나 방대한 양의 이미지 파일을 저장해야 하는 경우가 많을 것이기 때문입니다. 아래는 제가 직접 제작한 1인 개발 앱 입니다. 저는 Glide에 기본 캐시가 있다는 것을 ..
[Dagger-Hilt] ActivityScope 와 ActivityRetainedScope 의 차이 Hilt Hilt 는 현재 가장 주목 받는 DI (Dependency Injection) 라이브러리입니다. 안드로이드 제트팩 라이브러리 이기도 하죠. Hilt 에는 수많은 스코프 가 있습니다. 스코프의 존재 이유는 외부에서 생성되어 주입되는 인스턴스가 안드로이드 컨테이너의 생명주기에 따라 자동적으로 생성 및 해제되도록 하기 위해서입니다. 제 때 생성되지 않아 문제가 생기는 경우나, 해제되지 않아 지속적으로 메모리가 낭비되는 상황을 방지하기 위해서지요. Scoping an object A to another object B means that throughout the lifecycle of B, it’ll always have the same instance of A. (오브젝트 A를 B에 스코핑하는 것..
Coroutine Dispatcher 란 무엇인가? 안드로이드 개발을 꽤 오래 하셨던 분들, 또는 지방에서 일하고 계신 분들은 자바로 안드로이드 개발을 해보셨을겁니다. 저 또한 그랬습니다. 처음 개발을 배울 때부터 자바로 배워서, 코틀린같은 고급 언어는 굉장히 낯설었습니다. 코틀린의 코루틴이 그랬습니다. AsyncTask 나 Thread 를 사용해서 외부와 통신해왔던 저로서는 받아들이기 여간 어려운 것이 아니었습니다. 코틀린으로의 전환 이후 가장 처음 마주한 것이 코루틴이었습니다. 코루틴은 다음과 같이 실행됩니다. CoroutineScope(Dispatchers.IO).launch { // do something } CoroutineScope 는 코루틴을 실행시키기 위해서 꼭 필요하다는 것은 쉽게 알 수 있습니다. 그렇다면 Dispatcher 는 뭘까요?..
산책갈까? - 댕댕이를 위한 맞춤 날씨앱 GitHub - jangjh123/ShallWeGoForAWalk-Android: 날씨 점수 보고 댕댕이 산책갈까? - 댕댕이를 위한 맞춤 날씨 날씨 점수 보고 댕댕이 산책갈까? - 댕댕이를 위한 맞춤 날씨 앱. Contribute to jangjh123/ShallWeGoForAWalk-Android development by creating an account on GitHub. github.com 앱 는 애견인들과 댕댕이를 위한 앱입니다. 유저 위치에 따른 날씨 정보와 댕댕이의 정보를 통해 산책을 나가도 좋은 날씨인지 아닌지에 대해 점수로 알려주는 앱입니다. 다둥이 가족 유저를 위해, 여러 마리의 댕댕이를 추가하여 각 댕댕이의 산책 점수를 확인할 수 있습니다. 🛒 Download 산책갈까? - 반려견..