Developing Myself Everyday
article thumbnail
RxJava에 대해
Android/Kotlin 2023. 6. 6. 20:44

RxJava에 대한 공부를 시작하는 이유 요즘 프로젝트를 진행하면서 Retrofit2를 이용해 서버와 통신을 많이 진행하고 있다. 네트워크 요청은 Call 객체를 통해 비동기적으로 수행되고, enqueue() 메서드를 호출해 비동기로 요청을 실행하거나 execute() 메서드를 호출하여 동기적으로 실행할 수 있다. 예시는 아래와 같다. interface MyApiService { @GET("users/{id}") fun getUser(@Path("id") userId: String): Call } val BASE_URL = "baseurl" val retrofit = Retrofit.Builder() .baseUrl(BASE_URL) .addConverterFactory(GsonConverterFacto..

article thumbnail
[Kotlin Coroutine] (5) - Channel (채널)
Android/Kotlin 2023. 6. 6. 14:00

채널이란? 채널은 2개의 코루틴 사이를 연결할 수 있는 파이프 같은 것이다. 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있다. 만약 채널 내부의 용량이 다 찼는데 데이터를 채널에 보내려고 하면, 채널은 현재 코루틴을 일시 중단시키고 나중에 재개하게 된다. 이 부분이 자바의 동시성 API에서의 Blocking Queue와 채널의 가장 큰 차이이다. 채널의 타입 채널의 타입은 크게 4가지로 나눌 수 있다. 1. Buffered 2. Rendezvous (Unbuffered) 3. Unlimited 4. Conflated 이제부터 이 4가지의 타입을 어떻게 사용하는지 알아보겠다. 1. Buffered 고정된 크기의 버퍼를 생성하는 타입이다. 아래의 예제를 보자 fun main() { runBlocking..

[Kotlin Coroutine] (4) - 예외 처리
Android/Kotlin 2023. 6. 5. 16:54

예외 처리의 경우, 코루틴 빌더들은 다음의 전략을 따른다 1. 부모 코루틴이 자식에게 발생한 오류와 동일한 오류로 취소된다. 2. 자식들이 모두 취소되면 부모는 예외를 코루틴 트리의 윗부분으로 전달한다. 아래의 코드를 보면서 이해해보자 코드 fun main() { runBlocking { launch { throw Exception("A에 에러 발생") println("A 완료") } launch { delay(1000) println("B 완료") } println("메인") } } 결과 메인 Exception in thread "main" java.lang.Exception: A에 에러 발생 위의 코드를 보게 되면 최상위 코루틴이 "A 완료" 를 시작하기 전에 예외가 발생한다. 이로 인해 최상위 코루..

[Kotlin Coroutine] (4) - 코루틴 컨텍스트(JOB)
Android/Kotlin 2023. 6. 2. 11:10

잡은 동시성 작업의 생명주기를 표현하는 객체이다. 잡을 사용하면 작업 상태를 추적하고 필요할 때 그 작업을 취소할 수 있다. 잡의 객체에는 3개의 상태변수가 있다. isActive: 잡이 활성화 되었는지 isCancelled: 잡이 취소중이거나 취소 뒤었는지 isCompleted: 잡이 완료되거나 취소 되었는지 잡은 생성되자 마자 디폴트 상태인 활성화 상태가 된다. 잡을 생성할 때, CoroutineStart 타입의 파라미터를 지정해서 초기 상태를 지정할 수도 있다. CoroutineStart.DEFAULT: 디폴트 동작이며 잡을 즉시 시작한다. CoroutineStart.LAZY: 잡이 신규 상태가 되고 시작을 기다리게 된다. 다음의 예제를 보자 코드 fun main() { runBlocking { v..

[Kotlin Coroutine] (3) - 코루틴 스코프과 컨텍스트(Dispatcher)
Android/Kotlin 2023. 6. 2. 10:01

지금까지 살펴본 코루틴은 GlobalScope에서만 실행되었다. 경우에 따라서는 어떤 연산을 수행하는 도중에만 실행되기를 원할 수 있다. 어떤 코루틴을 다른 코루틴의 문맥에서 실행하면 후자가 전자의 부모가 되고 이런 관계로 인해 이런 실행 시간 제한이 가능하게 된다. 자식의 실행이 모두 끝나야 부모가 끝날 수 있도록 자식의 생명 주기가 연관된다. 이런 기능을 구조적 동시성이라고 부르며, 블럭이나 서브루틴을 사용하는 경우 구조적 동시성을 비교할 수 있다. 다음은 이런 구조적 동시성을 나타낸 예제이다. import kotlinx.coroutines.* fun main() { println("메인 스레드 시작") runBlocking { println("부모 task 시작") launch { println("..

[Kotlin Coroutine] (2) - 코루틴의 기본 개념
Android/Kotlin 2023. 6. 1. 11:17

코루틴이란 together를 뜻하는 co와 작업들의 집합을 뜻하는 Routine이 합쳐져 만들어진 단어로 '협동 루틴'을 뜻한다. 일반적으로 루틴은 하나의 입구와 출구를 가지는 반면, 코루틴은 여러개의 입구와 출구를 가질 수 있다. 이런 특징으로 이전에 실행이 중단된 지점에서 다시 실행을 재개할 수 있는 기능을 가진다. 코루틴의 개념 코루틴을 이해하기 위해서는 3개의 기본 개념을 이해해야 한다. Coroutine Scope (코루틴 스코프): MainScope, GlobalScope, Coroutine Scope 등이 있다. Coroutine Builders (코루틴 빌더): 코루틴을 생성하는 메소드를 의미한다. launch, async, withContext, runBlocking 등이 있다. Coro..

[Kotlin Coroutine] (1) - 자바 동시성, 스레드
Android/Kotlin 2023. 5. 31. 11:21

안드로이드 개발을 하다 보면 어쩔 수 없이 동시성에 관련된 문제들을 마주치기 마련이다. 안드로이드 개발에서는 코틀린의 코루틴을 통해 UI 스레드가 중단되는 문제를 효율적으로 처리할 수 있다. 이제부터 코루틴에 대한 기본 개념과 사용 방법을 알아보고자 한다. 자바 동시성 코틀린이 존재하기 전 자바에서는 동시성을 어떻게 처리했을까? 바로 자바 동시성 기본 요소를 사용하는 것이다. 자바 동시성 기본 요소를 사용하면 스레드 안전성을 달성할 수 있다. 하지만 엄청난 단점이 존재한다. 대부분의 동시성 연산이 Blocking 연산임으로 스레드를 블럭하고 실행을 재개할 때 Context Switch(문맥 교환)를 해야 하므로 프로그램 성능에 부정적인 영향을 미치게 된다. 그래서 동시성 스레드를 많이 사용하는 것은 비실..

article thumbnail
Serializable & Parcelable
Android 2023. 5. 30. 19:25

안드로이드 앱을 개발할 때 데이터를 전달해야 하는 경우가 있다. 이 때 복잡한 클래스의 객체를 이동하려는 경우 Serializable 또는 Parcelable을 사용해 직렬화하여 데이터를 전달해야 한다. 이제부터 이 2가지에 대해서 알아보도록 하겠다. ※ 직렬화란? 메모리 내에 존재하는 정보를 보다 쉽게 전송 및 전달하기 위해 바이트 코드 형태로 나열하는 것 JVM의 메모리에 상주 되어있는 객체 데이터를 바이트 형태로 변환하는 기술 Serializable 자바에서는 Value Object를 쉽게 직렬화 하기위해 Android SDK가 아닌 표준 자바의 인터페이스인 Serializable 이라는 인터페이스가 있다. 이 인터페이스를 구현한 클래스는 다음과 같다. By Java import java.io.Se..