개발/Kotlin(17)
-
Coroutine Flow BackPressure & Buffer
BackPressure 업스트림 생산자가 다운스트림 소비자에게 스트림을 emit하는데, 소비자가 emit속도를 맞춰 방출할 수 없을 때 발생 ( 처리속도 고려 없이 emit )메모리 사용 및 성능 문제가 발생해결하기 위한건? → buffer Buffer아래와 같이 적용하면 됩니다lifecycleScope.launch { flowOf("A","B","C","D","E") .onEach { println("Wizard emits: $it") } .buffer() .collect { println("Lady collects: $it") delay(2000) } } 요것이Wizard emits A Lady collects A Wizard emits B Lady collects B Wizard emits C La..
2023.11.30 -
When 조건문을 다양하게 사용하기
kotlin을 사용하는 개발자들이라면..주로 조건 필터링을 when을 사용할것이다. 왜냐면 보기 편함 when문이라는것은 …기본 구문when(x) { value -> {} value2 -> {} value3 -> {} }이런 식으로 사용을 하는 친구인데 단일 케이스 다중 값when(x) { 1,2,3 -> {} else -> {} }이런식으로, 공통된 결과를 만드는 케이스들을 모아서 사용할 수도 있다.여기까지는 다들 사용하고 있을거고…나도 익숙하다.아래부터는 조금 다양한 변형을 살펴보자 조건 분기when [ x.isOdd() -> {} x.isEven() -> {} else -> {} }이런 식으로..표현식을 포함한 조건들도 비교가 가능하다. 스마트 캐스트when(x) { is String -> {} i..
2023.11.30 -
Kotlin testable code
모든 개발자들의 숙명여전히 테스터블한 코드 하하 (지도 못 짬) 그래서 대충 긁어와봤다 1. 인터페이스를 사용할것인터페이스란? 구현 요구 사항을 위한 빈 껍데기. 캡슐화할때 습관적으로 써야한다~~~~ 좋은 테스트 환경을 만들기 위해서는 구현 클래스가 인터페이스를 받아 구현함으로써 규칙에 맞게 개발되도록 해야한다 // interface interface LoginRepository { fun signIn(authId: String): String } // concrete implementation class class LoginRepositoryImpl: LoginRepository { overide fun signIn(authId: String): String { // implementation logi..
2023.11.30 -
Kotlin flow 병렬로 장기 작업 실행
작업 가져오기특정 날짜에 결석한 학생 테이블에서 학생 정보 가져오기물리학을 공부하는 학생 목록 가져오기 // 결석 학생 목록을 가져오는 suspension 함수를 정의합니다. stop fun getAbsentStudents (date: Date ) : List { // 결석 학생 목록을 가져오기 위해 장기 실행 작업을 수행합니다 . // 결석 학생 목록을 반환합니다 . } // 물리학을 공부하는 학생 목록을 가져오기 위해 일시 중지 함수를 정의합니다. suspens fun getPhysicsStudents () : List { // 물리학을 공부하는 학생 목록을 가져오기 위해 장기 실행 작업을 수행합니다. // 물리학 학생 목록을 반환합니다. } / / 두 가지 정지 함수의 실행을 병렬화하는 흐름을 정의..
2023.11.01 -
to clean code (in Kotlin)
Kotlin ContractsCallsInPlace컴파일러가 람다 함수가 호출되는 방식과 해당 매개변수와 상호작용 하는 방식을 이해하는데 도움이 됨AT_MOST_ONCEAT_LEAST_ONCEEXACTLY_ONCEUNKNOWNinline fun customRun(block: () -> T): T { contract { callsInPlace(block, AT_MOST_ONCE) } return block() } InvocationKind호출시 함수가 작동하는 방식을 지정. 옵션은 아래 두 개returns(true)implies(this ≠ null)fun getUserById(id: Int?): User? { contract { returns(true) implies (id != null) } // Yo..
2023.10.23 -
Viewmodel / manage string res
Solution! stringres를 사용하는 방법sealed class AppString{ data class Res(@StringRes val resId: Int, vararg val arguments: Any): AppString() data class Quantity(@StringRes val quantityResId: Int, quantity): AppString data class Text(val value: String): AppString() } 이제 새 AppString클래스는 단일 인터페이스를 제공하여 ViewModel에서 View까지 다양한 유형의 문자열을 정의하는 데 도움이 되며, AppString클래스와 해당 내용이 POJO(또는 POKO)이므로 리소스를 포함할 필요 없이 단위 테..
2023.10.23