본문 바로가기

분류 전체보기

(55)
Compose의 Stateful과 Stateless 개념 Stateful 이란? 내부에서 상태를 생성하는 컴포저블을 stateful이라고 한다. Stateless 이란? 외부로 부터 상태를 받는(상태 호이스팅) 컴포저블을 stateless라고 한다. 상태를 내부에서 생성한다는 의미는 아래와 같이 name, onValueChange와 같은 상태를 직접 생성하는 컴포저블 함수를 말한다. // Stateful 함수 @Composable fun SomeScreen() { val name by rememberSaveable { mutableStateOf("") } Column(modifier = Modifier.padding(16.dp)) { Text( text = "Hello, $name", modifier = Modifier.padding(bottom = 8.dp..
Sealed Class를 이용한 Retrofit 결과 처리 sealed class Result { data class Success(val data: T) : Result() data class Check(val message: String) : Result() data class Error(val message: String) : Result() override fun toString(): String { return when (this) { is Success -> "Success[data=$data]" is Check -> "Type Check[message=$message]" is Error -> "Error[exception=$message]" } } } sealed class를 사용할 경우 enum과는 달리 여러가지 형태의 데이터 유형을 선택할 수 있..
코틀린 플로우 개념 Flow는 여러 값을 순차적으로 내보낼 수 있는 비동기 스트림(콜드)이다. 데이터 스트림은 다음과 같은 세 가지 항목으로 다눌 수 있다. 생산자 Flow 스트림에 추가되는 데이터를 생산한다(emit) 중개자 Flow 스트림에 내보내는 데이터를 가공한다.(선택사항) 소비자 생산자와 중개자를 통해 생산된 데이터를 소비한다.(collect 등) 종류 생산자 flow 가장 기본적인 생산자이다. fun flowNumber(): Flow = flow { repeat(10) { emit(it) delay(100) } } flowOf flow와 달리 생산 인자를 직접 입력해 줘야 한다. fun flowNumber(): Flow = flowOf(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) asFlow li..
안드로이드 테스팅 개발을 하다 보면 Repositrory 혹은 UseCase(domain 레이어를 사용할 경우)에서 로직이 정상적으로 작동하는지 시험해 보고 싶을 때 가 있을 것이다. 이와 관련하여 hilt와 TestDispatcher, mockk등을 이용하여 쉽게 테스팅 코드를 설정하는 법에 대해 알아보자 먼저 app단 gradle에 라이브러리를 추가해준다. testImplementation ("com.google.dagger:hilt-android-testing:2.41") // ...with Kotlin. kaptTest ("com.google.dagger:hilt-android-compiler:2.41") // ...with Java. testAnnotationProcessor ("com.google.dagger..
백준 9663 백 트래킹 코틀린 백트래킹을 간단히 설명하자면 dfs 탐색에서 조건을 만족하는 부분만(깊이) 탐색한다고 생각하면 된다. 부모 노드의 자식 노드중 조건에 해당하지 않는 자식 노드가 있다면 그의 자식 노드들 또한 탐색하지 않는다. 가장 대표적인 문제가 n-queen문제이다. n x n의 체스판에 n개의 퀸이 서로를 공격하지 못하게 하는 문제이다. x o x x x x x o o x x x x x o x 위와 같이 퀸(o)이 서로 공격 못하는 경우의 수를 구하는 문제이다. 만약 퀸이(0.1)일 경우 다음 행에서는 같은 열과 대각선에 퀸을 놓을 수 없으므로 해당 부분을 자식으로 하는 경우를 제외한(백트래킹) 방법으로 탐색을 이어 나가면 된다. ex) 0 0,1 / / \ \ 1 1,0(x)1,1(x) 1,2(x) 1,3(o) /..
비동기 callback을 동기로 처리하기 suspendCoroutine, suspendCancellableCoroutine 기존에 callback 방식을 이용하여 비동기식으로 사용되고 있는 함수를 suspendCoroutine, suspendCancellableCoroutine, callbackFlow를 이용하여 동기식으로 이용하는 방법에 대해 알아보자. (callbackFlow는 추후 포스팅 예정) callback함수를 통해 하나의 테이터만 전달할 경우 suspendCoroutine, suspendCancellableCoroutine 이용하고 지속적인 데이터 전달이 있을 경우는 callbackFlow를 사용하면 된다. public suspend inline fun suspendCoroutine(crossinline block: (Continuation) -> Unit): T { contract { callsInPlace(b..
코틀린 StateFlow 및 SharedFlow 스트림 콜드 스트림인 Flow와 달리 StateFlow와 SharedFlow는 핫 스트림이다. Flow에서 콜드 스트림이란 collect 시점과 상관 없이 emit 된 모든 값들을 받아오는 것 을 말한다. 핫 스트림이란 collect한 시점 이후 발생한 emit 값만 받아 오는 것을 말한다. ex) lateinit var flowTest : Flow val stateFlowTest = MutableStateFlow(0) val sharedFlowTest = MutableSharedFlow(0) someScope.launch { launch { flowTest = flow { for (i in 0 until 10) { emit(i) delay(1000) } } } launch { for (i in 0 un..
백준 5582번 공통 부분 문자열 코틀린 lcs를 이용한 dp 문제이다. 두 문자의 길이에 따라 각각 i행과 j열로 이루어진 표를 만들고 i행의 문자와 j열의 문자가 같으면 값을 표시하면 된다. 현재 값이 같고(i, j) 대각선 위의(i-1, j-1) 값이 같은 경우면 문자가 연속 된 경우임으로 해당값(i-1, j-1)에 +1을 해주면 된다. (표를 그려보면 알 수 있다.) 코틀린으로 풀때 자꾸 메모리 초과가 나와서 실패 했는데.. Array(row) {Array{column} {0}} 으로 초기화 할 경우 0으로 초기화 하는 과정에서 메모리 문제로 실패하게 된다ㅠ fun main() { val word1 = readLine()!! val word2 = readLine()!! val row = word1.length + 1 val column ..