목록분류 전체보기 (56)
성장기록지

debounce란?debounce는 이벤트를 그룹화하고 일정 시간동안 이벤트가 발생하지 않으면 가장 마지막 이벤트를 전달한다.'penguin' 이란 단어를 검색한다고 해보자.p -> pe -> pen -> peng -> pengu -> penguin 과 같이 한글자씩 작성하게 될 것이다.별 다른 조치를 하지 않는다면 글자를 쓸때마다 이벤트가 전달되겠지만,Debounce로 일정 시간을 지정해주면 그 시간 동안 이벤트가 발생하지 않을 경우 가장 마지막 이벤트를 전달하게 해준다. 예를 들어 debounce를 0.5초로 설정해주고, penguin이라는 단어에서 한글자 작성하는데 0.3초씩 걸린다면,penguin 단어를 완성 후 0.5초 이후에 이벤트가 전달이 된다. 그림으로 본다면 다음과 같다. 1 ~ 5번의..

DiffUtil이란 androidx 패키지에 포함되어 두 리스트 간의 차이를 계산하고, 새로운 리스트로 변경하기 위한 작업목록을 반영하는 것에 도움을 주는 유틸리티 클래스이다. DiffUtil을 쓰지 않았을 때개인 프로젝트에서 RecyclerView.Adapter 의 list를 update할 때 다음과 같이 진행하였다.코드와 같이 아이템을 추가할 때, 전체를 새로고침하는 notifyDataSetChanged()를 사용하거나.아니면 최적화를 위해 범위 내에서만 아이템을 삽입하는 notifyItemRangeInserted()를 사용할 수 있다.class HomeShoppingItemAdapter : RecyclerView.Adapter() { private val items = mutableList..

Paging이란?공식문서에는 다음과 같이 작성되어져있다.요약하자면 데이터를 가져올 때 한 번에 모든 데이터를 가져오는 것이 아니라 페이지로 나눠서 가져오는 것을 뜻한다.이때 데이터는 로컬 데이터베이스에 있을 수 있고, 통신을 통해 가져올 수도 있는 것이다. Paging의 장점영어는 어려우니 하나씩 해석해보겠다.페이징 된 데이터의 in-memory 캐싱 -> 앱이 페이징 데이터로 작업하는 동안 시스템 리소스를 효율적으로 사용 가능요청 중복 제거 기능이 기본으로 제공되어 앱에서 네트워크 대역폭과 시스템 리소스를 효율적으로 사용 가능.사용자가 로드된 데이터의 끝까지 스크롤할 때 구성 가능한 RecyclerView 어댑터가 자동으로 데이터를 요청 (무한 스크롤이 구현 가능하다는 뜻.)Kotlin 코루틴 및 F..

StateFlow의 개념 StateFlow는 SharedFlow의 구체화 버전이다.(상속 받음)구독자가 생기면 값을 발행하지만, 구독자가 사라져도 최신 값을 메모리에 유지한다. (hot Stream)여러 구독자에게 최신 값을 발행할 수 있다. (hot Stream) StateFlow는 1의 고정된 replayCache값을 가진다. (한가지 값만 가지고 있을 수 있다는 뜻) StateFlow를 왜 사용하는가 (LiveData와 비교)우선 우리는 LiveData에 대해 살펴 볼 필요가 있다.기존에 viewModel에서는 주로 LiveData를 통해 값을 갖고있도록 하였다.왜냐면 Observable한 데이터 홀더 클래스인 LiveData는 다음과 같은 장점이 있기 때문이다.LiveData는 Activity, ..
1. Flow란?Flow는 Kotlin의 코루틴 라이브러리에서 제공하는 API로, 비동기 데이터 스트림을 처리하기 위한 도구이다.Flow는 콜드 스트림(cold stream)으로 작동하며, 데이터가 필요할 때만 스트림을 생성하고 실행한다. 2. Flow - cold Stream Flow는 구독(subscribe)하기 전까지 실행되지 않으며, 데이터 흐름을 생성하지 않는다.이는 Lazy evaluation과 비슷한 개념으로, 사용자가 Flow를 구독할 때 비로소 스트림이 시작된다. Flow가 cold Stream이기에 얻는 특징들은 다음과 같다.데이터가 내부에서 생성된다.소비자가 소비를 시작할 때 데이터를 생산한다.Cold Stream은 하나의 생산자에 하나의 소비자만 존재한다. (UniCast)Flow가..

Data Stream데이터의 순차적인 흐름을 의미동기적으로 동작하는 data Stream의 대표적 예시로 Sequence가 있다.비동기적으로 동작하는 data Stream의 대표적 예시로 Flow가 있다. Flow는 다음 글에 자세히 다루겠다.Sequence(List와 비교)List는 모든 값을 한번에 생성하고, 반환한다.하지만 Sequence는 순차적으로 데이터를 처리 후 반환한다 이렇게 간단하게 설명한다고 이해가 쉽지는 않으니 조금 더 자세히 설명해보겠다.Sequence의 목적sequence의 주요 목적은 컬렉션 각 요소를 지연 처리하는 것이다.주로 하나의 스레드에서 순차적으로 요소를 처리하는데 초점을 맞추고 있다.순차적인 처리에서 병렬 처리는 결함 요소가 될 수 있기에 효율적인 단일 스레드 처리를 ..

Compose Structure컴포즈는 다음과 같은 구조로 이루어져있다.여기서 Compiler와 Runtime은 Compose compiler와 Compose Runtime이다. Compose CompilerCompose를 사용해보신 분이라면 Kotlin 함수에 @Composable 어노테이션을 붙인 함수는Composable 함수로 변환되는 것은 모두가 알고 있는 사실이다.그렇다면 코틀린에서 어노테이션은 기본적으로 어떻게 처리되어질까? kapt나 ksp를 통해 이루어진다.하지만 Compose는 일반적인 어노테이션 프로세서로 처리하지 않고, compose 컴파일러를 활용한다.Compose 컴파일러는 순수 코틀린으로 작성된 코틀린 컴파일러의 플러그인이다.자바로 Compose를 사용할 수 없는 이유이기도 하다..
문제 풀이트리를 순회하며 각 노드의 번호를 구하는 문제이다.트리는 중위순회를 진행하라고 설명에서 작성되어 있다.(중위순회란? LEFT - ROOT - RIGHT 순서대로 순회하는것.) 재귀를 통하여 문제를 풀고자 하였다.한 노드의 왼쪽 자식노드 인덱스는 2^n+1 이고 오른쪽은 2^n+2 이기 때문이다.따라서 아래와 같이 재귀함수를 구성하였다.def back(n): if n>=max_count: return back(2*n + 1) ans[n] = lst.popleft() back(2*n + 2) 루트 노드들은 먼저 입력받은 숫자에서 가장 왼쪽 값을 빼서 넣어주며 정답 리스트인 ans를 완성하였다. 이후에 for문을 통해 각 레벨마다 값을 출력해주며 마무리하였다. ..

부스트캠프 미션이나 프로젝트를 진행하며 네트워크 통신에는retrofit과 Okhttp를 같이 쓰는게 거의 정석처럼 사용되어졌다.이번 프로젝트를 계기로 기술 사용에 대한 근거를 세워보고자 한다.1. HttpURLConnection안드로이드 초창기에는 자바로 만들어진 HttpURLConnection이 네트워크 요청의 표준이었다고 한다.자바에서 기본적으로 제공하는 클래스이기 때문에 호환성 문제도 없고 가볍게 사용할 수 있다는 장점이 있지만,현재 시점에선 다음과 같은 문제들이 있다. 비동기 처리HttpURLConnection은 기본적으로 동기 방식으로 동작한다.즉, 네트워크 요청이 완료될 때까지 메인 스레드가 차단(blocking)된다.실제로 부스트캠프를 하며 httpUrlConnection을 사용해 보았을 때..

MVVM 아키텍처 패턴 개요MVVM(Model-View-ViewModel) 패턴은 안드로이드 앱 개발에서 구조적 명확성과 확장성을 위해 널리 사용되는 설계 패턴이다. 이 패턴은 다음 세 가지 구성 요소로 나뉜다.1. Model앱의 데이터 및 비즈니스 로직을 담당한다.데이터 소스와의 상호작용 및 데이터 처리를 수행한다.2. View역할: 사용자가 직접 상호작용하는 UI 부분. 레이아웃 파일(.xml), Activity, Fragment 등이 포함된다.의존성 제거: LiveData나 DataBinding을 사용하여 ViewModel과의 의존성을 최소화한다.주요 기술:LiveData: ViewModel로부터 데이터를 관찰하고 변경 사항을 자동으로 UI에 반영.DataBinding: 레이아웃 파일에 ViewMo..