data class DialogConfig( val icon: Int = -1, val title: Int = -1, val onCancelListener: (() -> Unit)? =null)fun makeDefaultDialogConfig() = DialogConfig( icon = R.drawble.ic_dialog, title = R.string.dialog_title, onCancelListener = { it.cancel() })코틀린은 함수형 스타일과 객체 지향 스타일로도 작성할 수 있습니다. OOP는 객체를 생성해서 사용하므로, 객체를 생성하는 방법을 정의하여야 합니다. 객체 생성 방식에 따라서 다른 특징이 생기기에 여러 방법을 알아야 합니..

추상화(abstraction)은 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것을 말합니다. 간단하게 말하자면, 추상화는 복잡성을 숨기기 위해 사용되는 형식을 의미합니다. 대표적인 예로는 인터페이스가 있습니다. 어떤 객체애 대한 추상화는 여러 가지가 나올 수 있고, 객체는 여러 형태로 추상화해서 표현할 수 있습니다. 추상화를 하려면 객체에서 무엇을 감추고 무엇을 노출해야 하는지를 결정해야 합니다. 프로그래밍에서의 추상화프로그래밍에서 하는 일은 기본적으로 추상화입니다. 예를 들어 숫자를 입력하면, 이는 내부적으로 0과1이라는 형식으로 표현됩니다. 추상화를 설계한다는 것은 단순하게 모듈 또는 라이브러리로 분리한다는 의미가 아닙니다. 강력한 프로그래밍 언어들이 갖고 있는 기..

사진: Unsplash의John Matychuk 이번 게시글에서는 Flow의 collect에 대해 알아보고, collect가 코루틴을 언제 중단시키는지 문제와 함께 알아보고자 합니다. Flow의 collect 메서드Flow는 비동기 데이터 스트림으로, 순차적으로 값을 방출하고 정삭적으로 완료하거나 예외와 함께 완료됩니다. Flow inferface에는 `collect` 메서드가 존재하는데, 이 메서드는 FlowCollector를 입력받아 데이터를 emit할 수 있도록 합니다.public interface Flow { public suspend fun collect(collector: FlowCollector)} collect는 suspend 함수이다.여기서 알아두어야 할 것은 `collec..
아이템 19 - knowledge를 반복해서 사용하지 말라프로그래밍의 가장 큰 규칙은 아래와 같습니다 "프로젝트에서 이미 있던 코드를 복사해서 붙여놓고 있다면, 무언가가 잘못된 것이다." Knowledge프로그래밍에서 knowledge는 넓은 의미로 '의도적인 정보'를 뜻합니다. 알고리즘의 작동 방식, UI의 형태, 우리가 원하는 결과등이 모두 '의도적인 정보'입니다. 그 중 2가지를 뽑자면 아래와 같습니다.비즈니스 Logic: 프로그램이 어떠한 식으로 동작하는지와 프로그램이 어떻게 보이는지공통된 알고리즘: 원하는 동작을 하기 위한 알고리즘둘의 가장 큰 차이점은 시간에 따른 변화입니다. 로직은 시간이 지나면서 변하지만, 알고리즘은 크게 변하지 않습니다. knowledge가 반복되면 확장성을 막고, 쉽게..

사진: Unsplash의Erfan 이번 게시글에서는 SharedFlow에 `emit()`을 호출할 때 발생했던 의문점을 해결해보고자 합니다. 의문점: 왜 SharedFlow의 emit()은 suspend 함수일까?저는 ViewModel에서 발생하는 Effect를 SharedFlow를 통해서 관리하고 있습니다. 예를 들어, 스낵바를 띄우는 행위를 하기 위해 SharedFlow에 `emit()`을 해야 하는데, 이를 위해 매번 viewModelScope.launch를 통해 별도의 코루틴을 생성해야 했습니다. private fun showSnackBar(message: String) { viewModelScope.launch { _UiEffect.emit(UiEffect.ShowSnac..

사진: Unsplash의Kelly Sikkema 이번 게시글에서는 얕은 복사와 깊은 복사에 대해 이해해보고, 데이터 클래스의 copy는 어떤 복사를 하고 있는지 알아보고자 합니다. 얕은 복사와 깊은 복사 이해하기"복사"한다는 것은 프로그래밍 관점에서 데이터를 새로운 메모리 공간에 재배치하여 원본 데이터와 독립적인 데이터 구조를 생성하는 작업을 의미합니다. 얕은 복사(Shallow Copy)얕은 복사는 객체의 참조 주소만 복사하여 새로운 객체를 생성하는 방식입니다. 만약 최상위 타입의 객체가 존재한다면, 최상위 객체만 새로운 메모리 공간에 복사하고 그 내부의 속성들은 원본 객체와 같은 참조를 공유하게 됩니다.fun main() { val original = mutableListOf("Bob",..

사진: Unsplash의Kelli McClintock 안드로이드 애플리케이션에서 4대 컴포넌트 구성 요소들 간에 통신에 사용되는 객체인 `Intent`를 개발하면서 많이 사용했었습니다. 문득, Intent가 어떤 식으로 동작하는지가 궁금해져 이번 게시글에서 이를 알아보고자 합니다. Intent에 대한 기본적인 내용은 이 게시글에서는 다루지 않습니다. 만약 해당 내용이 필요하시다면 아래의 게시글을 참고해 주세요. Android의 Intent (인텐트)인텐트란?인텐트는 안드로이드 애플리케이션에서 4대 컴포넌트 구성 요소들 간에 통신하는 데 사용되는 객체입니다. 인텐트는 Activity를 실행하는 데 가장 많이 사용되지만 다른 용도도 있습니everyday-develop-myself.tistory.com ..

사진: Unsplash의April Walker 안드로이드 개발을 할 때, ViewModel을 사용하는 것은 이제 옵션이 아닌 필수일 정도로 ViewModel을 사용하는 것은 매우 당연해 졌습니다. 시간이 지나며 새로운 기술일이 나오게 되면서, 이에 대응하여 ViewModel의 사용 방법은 우리가 눈치채지도 못하게 자연스럽게 바뀌었습니다. 그러면서 모르고 지나갔던 부분들을 톺아보고자 이번 게시글에서는 ViewModel을 어떻게 사용하고 있는지 살펴보고자 합니다. 이 게시글은 3가지의 시리즈로 구성되어 있습니다. (1) - ViewModel의 생성과 관리 [현재 게시글](2) - ViewModel과 SaveStateHandle (3) - Hilt와 함께 ViewModel 가져오기 ViewModel의 ..