kotlin
-
coroutine - launch, async, CoroutineContext개발 2023. 2. 28. 20:00
launch, async coroutine을 시작하는 방법은 launch, async가 있다. launch는 결과값을 반환하지 않고 async는 await를 이용해서 결과값을 반환할 수 있다. fun main() { ThreadTest().runCoroutine() } class ThreadTest { fun runCoroutine() = runBlocking { val jobs = ArrayList() (1..5).map { number -> val job = async { delay((Math.random() * 1000).toLong()) println("${Thread.currentThread().name} done, number: $number") increaseCounter() return@a..
-
kotlin data class 는 상속을 가능하면 쓰지 말자개발/삽질 기록 2021. 12. 8. 22:06
kotlin data class는 데이터만 보유하는 클래스를 만들 때 관리하기 용이한 클래스다. data class 로 클래스를 만들면 객체 간의 동등성 비교시 사용되는 hashCode 함수를 자동으로 만들어주기 때문에 단순히 데이터를 관리하는 것 뿐만 아니라 데이터간의 비교도 쉬워진다. 여기서 hashCode 함수는 생성자의 멤버 변수의 값으로 만들어 지는데 이것은 객체 간의 비교를 주소값으로 하지 않고 객체의 멤버변수의 값으로 하기 위함이다. 아래의 User 데이터 클래스로 선언된 a, b 변수는 모두 다른 메모리에서 선언 됐지만 hashCode 상으로는 동일한 값을 보이므로 동등성 비교에서는 같은 값을 보인다. data class User(val age: Int, val name: String) f..
-
Coroutine + Retrofit | Coroutine + Room개발/안드로이드 2021. 7. 22. 21:00
Coroutine + Retrofit Retrofit 2.6.0 버전부터 suspend 함수로 api를 작성할 수 있게 됐다. 다른 Retrofit 인터페이스처럼 어노테이션을 추가하고 suspend 함수를 추가하면 빌드 될 때 Retrofit 에서 전처리한다. interface LibraryApi { @GET("/1.0/new") suspend fun getNew() : BookListResp } suspend로 쓰였기 때문에, api 를 호출하는 부분에서도 suspend 함수를 받아서 처리할 수 있다. 예로 Repository 인 경우 suspend 함수를 이용해서 아래 코드로 표현이 가능하다. withContext를 받아서 I/O 쓰레드에서 실행하도록 변경해 Main 쓰레드 안전성이 보장됐다. cla..
-
suspend fun개발/안드로이드 2021. 7. 22. 20:00
코틀린에서 추가된 suspend 함수는 Coroutine 내에서만 실행 가능한 함수다. 블로그 글마다 suspend 함수에 대해서 각각 정의가 다른데 나는 suspend 함수를 Coroutine Context를 갖고 있는 함수 정도로 정의하고 싶다. 간단한 사용법 class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) CoroutineScope(Dispatchers.Main).launch { val sum = suspendSum(1, 2) // no compile error Log.d("suspend sum", sum.toStr..
-
Serializable 과 Parcelable개발/안드로이드 2021. 6. 19. 14:03
Serializable Serialization(직렬화)란 자바 시스템 내부에서 사용하는 객체를 외부의 자바 시스템에서도 사용할 수 있도록 byte형태로 데이터를 변환시키는 기술을 말하며 안드로이드 상에선 직렬화를 이용해 액티비티간 또는 서비스간 클래스 타입의 데이터를 주고 받는 용도로 주로 사용한다 아래 처럼 Student 클래스를 Serializable 선언 해준다면, 다른 액티비티에 클래스 형태 그대로 값을 전달 해줄 수 있다. Serializaable 선언 외에 추가하는 코드가 없어서 사용하기 정말 편리하다. data class Student(val name: String, val age: Int) : Serializable val intent = Intent().apply { this.putEx..
-
kotlin lateinit, lazy by개발/안드로이드 2021. 6. 5. 14:59
자바에서 흔히 보게 되는 NullPointerException 문제를 예방하고자 코틀린에서는 변수 선언에서부터 Nullable 변수의 선언부터 엄격하게 관리한다. 변수를 선언 할 때도 Nullable인지 아닌지를 구분해야하고 Nullable인 경우에는 변수를 호출하는 코드에서 Nullsafe 지시자를 표시해야하며 그렇지 않으면 컴파일 단계에서 에러를 발생시킨다. var name: String? = null name = "abcd" name?.length() // name이 여전히 null 일 가능성이 존재하므로, null safe 접근만 허용된다 var name2: String = "abcd" name2 = null // name2가 nullable하지 않으므로 이 코드는 컴파일 오류가 발생한다 그런데 ..
-
Kotlin - Coroutine개발/안드로이드 2021. 5. 21. 20:00
Coroutine을 공부할 때 당장 실행되는 코드를 짜려고 launch, async 함수부터 먼저 써보게 되는데(과거의 나) 이것보단 Coroutine을 이루는 구조가 무엇인지를 먼저 공부하고 유틸리티 함수를 사용하면 훨씬 이해하기가 쉽다. Coroutine을 이루는 구조는 크게 CoroutineScope과 CoroutineContext다. 아래 그림으로 보면 CoroutineScope이 CoroutineContext를 포함하는 관계다. 1. CoroutineScope CoroutineScope은 Coroutine이 활동할 수 있는 범위를 말한다. 예를 들어 Coroutine이 ViewModel의 생성주기 내에서만 동작하게 할 수 있고 Activity Lifecyle 생명주기를 따라서 동작하게 할 수 있..
-
RxJava - debounce개발/안드로이드 2020. 7. 4. 15:17
debounce 는 특정 시간이 지난 후에 마지막으로 들어온 이벤트만 받을 수 있는 오퍼레이터다. 글로 구구 절절 설명하는 것보다는 아래 그림으로 이해하는게 쉬울 것 같은데 아래 그림에서 최종적으로 받는 이벤트가 1, 5, 6인데 모두 입력됐을 때랑 입력으로 들어올 때랑 배출 될 때 사이의 구간 길이가 동일하다. 아래 그림에서 길이는 시간을 의미하기 때문에 둘다 동일한 시간이 지난 후에 이벤트를 받는 것으로 보면 된다. 그리고 5 이벤트가 들어오기 전에 2, 3, 4가 있었는데 최종적으로 5만 이벤트로 받게 되는데 이건 특정 시간이 지나기 전에 다른 이벤트들이 들어와서 그렇다. 그래서 2, 3, 4 이벤트는 모두 무시하게 된다. debounce 오퍼레이터는 텍스트 입력과 관계된 작업에서 아주 요긴하게 써..