본문 바로가기

전체 글

컴포즈 스터디 1차 Compose 이해 Compose 이해 구글문서의 Compose 이해 문서를 요약한 내용이다. Compose 의 소개 영상의 도입부에서 컴포즈에대해서 대략적인 소개를한다. Compose는 선언형 UI 프레임워크로 UI가 표시해야할 상태값을 관리하면 이를 컴포즈가 핸들링하는 형식이란다.(데이터 바인딩도 마찬가지 아닌가?) 이는 기존 뷰를 다루는 방식과 굉장히 다르다고 한다. 그래서 그 다른점과 어떤 관점으로 컴포즈를 다뤄야하는지 이 동영상에서 다뤄본다고 한다. 컴포즈 답게 생각하기(Thinking in Compose) 뷰를 사용한다면 xml 작성후 어떤방식으로든 뷰를 찾아와서 setter를 통해서 원하는 값을 지정해준다고 한다.(누가 요즘 이런방식으로해 너무 억까아님? 물론 set하는걸 숨기고 하지만 그건 컴포즈도 마찬가지자.. 더보기
컴포즈 스터디 1차 시작 튜토리얼 정리 Compose 기본사항 시작 앞으로 다룰 내용들은 Android 개발자를 위한 jetpack compose 문서를 학습한 내용이다. 일간 시작점인 compose 기본사항의 항목을 따라가보자 1. 시작 듀토리얼 1.구성 가능한 함수 compose, composable 등등 이제 새로운 용어가 튀어나오니 얼탱이 없는 번역도 같이 튀어나올것이다. 기존에 activity가 활동, fragment 가 조각이였던것 처럼 이제 compose는 구성가능한 이라는 말을쓴다. 구성가능한이라니 그래도 기존것들보다는 선녀인것 같다. 이제 내용을 보자면 compose는 composable함수들을 중심으로 만들어졌다고 한다. 이러한 함수를 사용하면 UI의 구성 과정(요소 초기화, 상위 요소에 연결 등)에 집중하기보다는 앱 모양을.. 더보기
channels 7주차 1차 스터디 Fan-in 까지 Fan-out 구독자가 여러 어럿 있는 상황을 살펴보고있다. -> 값을 소비하는 코루틴이 여러개임 생산자 코드가 이러하고 -> 1초에 값 10개 생산 fun CoroutineScope.produceNumbers() = produce { var x = 1 // start from 1 while (true) { send(x++) // produce next delay(100) // wait 0.1s } } 소비하는 코드가 이러하다. -> 누가 소비하는지 숫자로 나타내줌 fun CoroutineScope.launchProcessor(id: Int, channel: ReceiveChannel) = launch { for (msg in channel) { println("Processor #$id received.. 더보기
channels 6주차 2차 스터디 Prime numbers with pipeline 까지 Pipelines 공식문서의 설명이 사실 난해하다고 생각한다. 일단 공식문서에 나와있는 부분을 해석해보고 이에대해 추가 조사한 자료들을 통해 다시 정리해보려한다. 파이프 라인은 하나의 코루틴이 값의 스트림을 무한이 만들어낼 수 있는 패턴이라고 한다. fun CoroutineScope.produceNumbers() = produce { var x = 1 while (true) send(x++) // infinite stream of integers starting from 1 } 예시가 이런데 while문으로 열어놓고 cancel 로 종료하는 형태를 주로 다룬다. 그리고 왜인지는 의문이지만 channels에는 딱히 중간연산자가 없다(map,filter 이런거 조차도 없다...) 그래서 이런것들을 chann.. 더보기
channels 6주차 1차 스터디 Building channel producers 까지 Channels 드디어 flow를 넘어 Channel 이다. 팀과 함께 스터디하니 높아보였던 장벽이 깰만했던것 같아 기분이 좋다. 이제 들어가보자!!! Deferred(async를 통해서 내뱉고 하는것) 을 통해 코루틴에서 single value를 전달할 수 있었다. 이제 Channels 는 값들의 stream을 전달할 수 있는 방법이다. Channel basics Channel 은 컨셉이 BlockingQueue와 비슷하다고 한다.(BlockingQueue가 뭔데 씹덕아) BlockingQueue의 put 연산을 send를 통해하고 take연산을 receive를 통해서 한다고한다. 이때 주요 차이점이 BlockingQueue는 대기 해야하는 상황에 쓰레드에 Block을 걸어버리는 반면에 -> Block.. 더보기
flow 5주차 1차 스터디 flow끝까지 Flow completion flow 종료시점에 작업을 해야할때 취할수있는 방법은 두가지이다. 선언적 방법, 명령형 방법 그냥 딱봐도 선언적 방법 쓸것같다... Imperative finally block trt/catch의 finally 블록을 이용하면 collect가 종료되는 시점의 작업을 해줄 수 있다. fun simple(): Flow = (1..3).asFlow() ​ fun main() = runBlocking { try { simple().collect { value -> println(value) } } finally { println("Done") } } ​ //결과 1 2 3 Done 가능이야 하겠지만 뎁스 깊어지는거 너무 열받지 않는가? 우테코 하고나서 성격이 나빠졌는지 이런것들을 보.. 더보기
Flow 4주차 2차 스터디 CatchingDeclaratively까지 Flow exceptions 자자자 이제야 나온다 오류 우하하하하하하하 Flow는 emit하는 도중, 연산자(중간,터미널) 에서 exception을 던지는 상황이 나온다면 exception으로 종료될 수 있다. 이에 대처하는 방법에 대해 다룬다고 한다. Collector try and catch 그냥 코틀린 tryCatch로 잡는 방법을 소개한다. 뭐 당연스럽게 runCatching으로 잡아도 될것이다. fun simple(): Flow = flow { for (i in 1..3) { println("Emitting $i") emit(i) // emit next value } } ​ fun main() = runBlocking { try { simple().collect { value -> println.. 더보기
Flow 4주차 1차 스터디 flatMapLatest 까지 Composing multiple flows 플로우를 합쳐내는 방법을 다룬다. Zip zip 사실 잘 안써서 생소하지만 두 플로우를 섞어서 쓸 수 있는 방법으로 zip이 있다. 예전에 학습했던 컬렉션 api를 뒤져보면 관련된 사용법을 겁나 많이 찾을 수 있을듯 하다 val nums = flow{ repeat(3){ emit(it) delay(100) } } // numbers 1..3 val strs = flow{ emit("???") } // strings nums.zip(strs) { a, b -> "$a -> $b" } // compose a single string .collect { println(it) } // collect and print ​ //결과 //0 -> ??? 이런저런 실험을 해.. 더보기