목록2025/01 (19)
성장기록지
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를 사용할 수 없는 이유이기도 하다..
Smart Recomposition이전 글에서 작성하였듯이, Compose 에서는 컴파일 시점에 객체들의 “안정성(Stability)“을 확인한다. 그리고 어떤 컴포저블 함수에 사용 된 모든 인자가 안정적이라면, 그 컴포저블 함수는 “생략 가능하다(Skippable)“라고 본다. 리컴포지션이 발생했을 때, 어떤 컴포저블 함수의 모든 인자가 안정적(Stable)이고 그 값이 전혀 변하지 않았다면 리컴포지션을 생략한다. 안정의 조건Compose에서는 크게 3가지 기준을 통해 안정성을 판단한다.두 인스턴스가 같은 상태라면 두 객체의 비교 결과(equals)는 항상 같아야 한다. (동등성)객체가 가진 모든 public 필드는 안정된 상태여야 한다.만약 값이 변경된다면 컴포저블에 알려져야 한다.추가적으로 Comp..
StabilityCompose는 타입을 stable과 unstable로 간주한다. stable은 mutable이여도 값의 변경을 알 수 있는 경우나 immutable 타입일 때 이다. composable에 변경되지 않은 안정적인 매개변수가 있는 경우 컴포저블은 해당 매개변수를 스킵한다. unstable은 값의 변경을 알기 어려운 경우이다.Compose는 composable에 unstable 파라미터가 있는 경우 매번 recomposition을 하므로성능 문제가 발생할 수 있따. Immutable한 객체 예시 (Stable)파라미터가 전부 val로 정의된 원시타입이기 떄문에 변경을 할 수 없다. 따라서 immutable 하고, stable class이다참고) 모든 원시 타입은 immutable이다. ex)..
문제 풀이트리를 순회하며 각 노드의 번호를 구하는 문제이다.트리는 중위순회를 진행하라고 설명에서 작성되어 있다.(중위순회란? 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을 사용해 보았을 때,별도의 비동기 처리를 해주지 않으면 NetworkOnMainThreadException이 발생하였..
문제풀이같은 단어를 그리디를 통해 어떻게 최대값과 최소값을 구별하는지가 목표인 문제다. 나는 다음과 같이 설정하고 문제를 풀었다. 최댓값은 M의 값들을 모두 10으로 곱해 누적한 뒤 K를 만나면 최종적으로 5를 곱해 처리.최소값은 M의 길이에 따라 지수 계산 (10^(길이-1))으로 값을 처리하며, K는 5를 직접 추가생각보다 쉽게 풀려서 놀랐던 문제이다. 코드n = input()num=''ans_lst=[]for i in n: num= num+i if i=='K': temp=1 for j in num: if j =='M': temp= temp*10 elif j=='K': tem..
MVVM 아키텍처 패턴 개요MVVM(Model-View-ViewModel) 패턴은 안드로이드 앱 개발에서 구조적 명확성과 확장성을 위해 널리 사용되는 설계 패턴이다. 이 패턴은 다음 세 가지 구성 요소로 나뉜다.1. Model앱의 데이터 및 비즈니스 로직을 담당한다.데이터 소스와의 상호작용 및 데이터 처리를 수행한다.2. View역할: 사용자가 직접 상호작용하는 UI 부분. 레이아웃 파일(.xml), Activity, Fragment 등이 포함된다.의존성 제거: LiveData나 DataBinding을 사용하여 ViewModel과의 의존성을 최소화한다.주요 기술:LiveData: ViewModel로부터 데이터를 관찰하고 변경 사항을 자동으로 UI에 반영.DataBinding: 레이아웃 파일에 ViewMo..
적용 계기다음과 같은 배너를 Custom View로 구현하고자 하였다. (현재는 배너 이미지로 대체하였다. 이유는 아래 서술)모델 이미지의 오른쪽 아래를 보면 배너와 같이 라운딩 처리가 되어있는것을 확인하였다.디자인의 요구사항과 똑같이 라운딩 처리를 해주고자 하였다.적용 과정먼저 이미지뷰에 라운딩 처리를 하는 법을 찾기 위해 구글을 검색하였다.사진과 같이 나오는 래퍼런스들은 많지만, 다 만족스럽지 않았다.clipToOutline을 통해 코드에서 동적으로 할당하거나,CardView를 활용하거나 하여 여러모로 불편한 조건들이었다.그러던 중, 부스트캠프 동료에게서 ShapeableImageView를 사용해보라는 말을 들었다! ShapeableImageView 적용하는 법은 간단하다.ImageView를 Sha..
data binding기존에 viewBinding을 포함한 기술에선UI 컴포넌트는 Activity나 Fragment에서 코드를 통해 속성을 설정해왔지만,data binding을 활용한다면 xml파일 내에서 view에 할당할 데이터를 선언할 수 있고,데이터가 변경되면 view도 갱신되게 된다. 즉 Layout의 Ui 컴포넌트를 데이터에 binding 할 수 있도록 지원하는 라이브러리이다.data binding의 특징뷰바인딩은 데이터를 뷰(ui)로만 전달이 가능하지만,데이터 바인딩을 사용한다면 양방향으로 데이터를 결합시킬 수 있다.레이아웃에서는 주어진 데이터로 UI를 출력하기에, 데이터만 관리하면 되니 역할분리도 제대로 되어진다!이러한 장점을 통해 MVVM 패턴을 적용할 때 사용되어진다. 그렇다면 view ..