도서27 2장 코루틴 라이브러리 - Coroutine Buidler 개요 모든 중단 함수에서 일반 함수를 호출하는 것은 문제가 없지만, 일반 함수에서 중단 함수를 호출할 수는 없다. 모든 중단 함수는 다른 중단함수에서 호출이 되어야 한다. 중단 함수는 어떻게 시작할 수 있을까? 바로 Coroutine Builder를 통해 시작할 수 있다. launch builder launch builder 가 동작하는 방식은 개념적으로 thread 함수를 사용해서 thread 를 시작하는 것 과 비슷하다. 독립적으로 코루틴이 실행이 되며 아래 예제와 같이 사용할 수 있다. fun main() { GlobalScope.launch { delay(1000L) println("World!") } GlobalScope.launch { delay(1000L) println("World!") }.. 2024. 2. 3. 코틀린 코루틴 이해하기 + 코루틴 실전 대입하기 해당 글은 사내에서 세미나를 한 것을 정리한 것이다. 핵심목표 코루틴의 작동 방식에 대해 간략하게 이해하기 기존에 사용하던 코루틴의 적절한 사용 여부 확인하기 잘못 사용된 경우, 그 수정 방법에 대해 고민하기 코루틴을 배워야 하는 이유? 예시를 들어보자. 아래 예시는 AP로부터 뉴스를 가지고 와서 정렬한 다음, 스크린에 띄우는 로직을 구현하는 경우다. fun onCreate() { val news = getNewsFromApi() val sortedNews = news .sortedByDescending{ it.publishedAt } view.showNews(sortedNews) } 위의 예제는 안타깝게도 위와 같은 방식으로 개발할 수 없다. 이유는 안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 .. 2024. 1. 23. 1장 코틀린 코루틴 이해하기 - 중단은 어떻게 작동할까? 시퀀스 빌더 시퀀스 빌더는 시퀀스를 만드는 도구이다. 시퀀스 빌더를 사용하면, 단계별로 데이터를 추가하면서 시퀀스를 구성할 수 있다. 예를 들어, yield 함수를 사용하면 하나의 요소를 시퀀스에 추가할 수 있고, yieldAll 함수를 사용하면 여러 요소를 한번에 추가할 수 있다. 간단히 말하면, 시퀀스 빌더는 단계별로 데이터를 추가하면서 '지연 계산'이 가능한 시퀀스를 만드는 도구이다. 시퀀스란 시퀀스는 코틀린에서 지원하는 특별한 종류의 컬렉션이다. 시퀀스의 주요 특징은 '지연 계산'이다. 즉, 시퀀스의 각 요소는 필요할 때까지 계산이 미루어지며, 이는 큰 데이터 셋을 다룰 때 메모리 사용량을 줄여준다. ※ 컬렉션(Collection) : 여러 개의 데이터를 그룹으로 관리할 수 있는 데이터 구조 특징.. 2024. 1. 9. 1장 코틀린 코루틴 이해하기 - 코틀린 코루틴을 배워야 하는 이유 코틀린 코루틴을 배워야 하는 이유 예시를 들어보자. 아래 예시는 AP로부터 뉴스를 가지고 와서 정렬한 다음, 스크린에 띄우는 로직을 구현하는 경우다. fun onCreate() { val news = getNewsFromApi() val sortedNews = news .sortedByDescending{ it.publishedAt } view.showNews(sortedNews) } 위의 예제는 안타깝게도 위와 같은 방식으로 개발할 수 없다. 이유는 안드로이드에서는 하나의 앱에서 뷰를 다루는 스레드가 단 하나만 존재하기 때문에 Main쓰레드는 블로킹되서는 안된다. 때문에 getNewsFromApi() 함수가 쓰레드를 블로킹 할 것이고, ANR 이 생길 것 이다. 위의 문제를 해결하기 위해 아래와 같이 .. 2024. 1. 8. Retrofit 과 Coroutine 간의 Viewmodel에선 Dispacher.IO로 전환해야 할까? 요즘 코루틴을 공부하며 서버 통신 및 내부 저장은 Dispacher.IO안에서 실행 한 후 Main으로 넘겨줘 ui에 반영해준다는 말을 지겹게 들었다. 이유는 Dispacher.IO는 필요에 따라 추가적으로 스레드를 더 생성하거나 줄일 수 있으며 최대 64개까지 생성이 가능하기 때문이라고 한다. 또한 Main을 점유하고 있으면 UI에서 작업하기에 ANR이 발생 할 수 있다고 한다. 그래서 구글에 나온 예시 코드를 보면 ViewModel.scope 안에 Dispacher.IO를 감싼 형태거나 먼저 Dispacher.IO 에서 코루틴 스코프를 설정하여 데이터를 가져온 후 내부에서 Dispacher.Main 으로 감싼 형태를 볼 수 있다. 이후 UseCase - Reopository - DataSorce - .. 2023. 11. 30. [DroidKnights 2023] 김준비 - Coroutine Deep Dive - Android 실전편 이번 글은 DroidKnights 2023에 나온 김준비님의 Coroutine Deep Dive의 내용을 정리한 글입니다. What is Coroutine? Routine : 컴퓨터 프로그램의 일부로써 특정한 일을 실행하기 위한 일련의 명령 SubRoutine? 프로그램 가운데 하나 이상의 장소에서 필요할 때마다 되풀이 해서 사용할 수 있는 부분적 프로그램이며 실행 후에는 메인 루틴이 호출한 장소로 되돌아간다. fun a() { b() c() } Coroutine 이란? 일시 중단(suspend)과 재개(resume)가 가능한 루틴이며 특정 Thread에 결합되지 않으며, 하나의 Thread에서 중단하고 다른 Thread에서 재개 가능한 부분적 프로그래밍이다. How does suspension.. 2023. 11. 14. Coroutine, Thread 와의 차이와 그 특징 Coroutine, Thread 와의 차이와 그 특징 처음 Kotlin 를 사용하던 중에 비동기 처리를 위해 Coroutine 개념을 마주했었습니다. 동기란 요청을 보낸 후 요청에 대한 반환값을 얻기 이전까지 대기하는걸 의미하고, 비동기는 그 대기시간동안 aaronryu.github.io Process & Thread Process: Program 이 메모리에 적재되어 실행되는 인스턴스 Thread: Process 내 실행되는 여러 흐름의 단위 먼저 Thread 는 Process 보다 작은 단위의 실행 인스턴스로만 알고 있는데, 메모리 영역도 조금 다르다. Process 는 독립된 메모리 영역(Heap)을 할당받고 각 Thread도 독립된 메모리 영역(Stack)을 할당받는다. Thread 는 본질적으로.. 2023. 7. 17. Coroutine 완벽 정리 면접 공부를 하면서 Coroutine을 정말 어설프게 써왔던 내 자신을 반성하며 다시한번 잘 정리해보도록 해보자. Coroutine이란 쓰레드가 아니고 쓰레드와 비교하면 메모리를 덜쓰고오버핸드가 적은 비동기 프로그램을 실행 할 수 있는 모듈 코루틴은 AsyncTask라는 비동기 프로그래밍이 메모리 누수등 어려 문제가 생겨 API 30부터 deprecated 되었다. 이후, 구글에서는 코루틴을 원장하게 되었다. 먼저 코루틴을 알아 보기전에 루틴이란 개념에 대해 알아보도록 하자. 프로그램은 메인루틴, 서브 루틴 흐름의 루틴이 존재한다. 메인루틴은 프로그램에서 메인함수 main() 에 진입했을때 위에서 부터 아래로 순차적으로 실행되는 전체적인 흐름이고 서브 루틴은 메인 루틴이 실행되다 개별 함수를 만나면 잠시.. 2023. 2. 14. Thread VS Coroutine 나는 코틀린을 사용하다보니 코루틴을 사용하는데 이를 가지고 비동기 처리를 했다. 하지만 쓰레드와 비슷한 동작을 하지만 다르다고 한다. 그 차이점을 작성해보고자 한다. 그전에 잠깐 기본 CS에 대해 알아보도록 하자. Process : 보조기억장치의 '프로그램'이 메모리 상으로 적재되어 실행되면 '프로세스'가 된다. Thread : 같은 Process 내에서 실행되는 여러 작업 (흐름)의 단위 동시성 (Concurrency) 동시성 프로그래밍은 말 그대로 동시에 여러 작업을 수행하는 것이다. 하지만 눈으로 보기에 동시에 실행되는 것이지, 사실 시분할(Interleaving) 기법을 활용하여 여러 작업을 조금씩 나누어서 번갈아가며 실행하는 것이다. 위 예제를 살펴보면, Task 1 과 Task 2 를 잘개 쪼.. 2022. 9. 29. Item4 - inferred 타입으로 리턴하지 말라 코틀린 타입 추론을 사용할 때는 몇 가지 위험한 부분이 있는데, 이러한 위험한 부분을 피하려면 할당 시에 inferred 타입은 정확하게 오른쪽에 있는 피연산에 맞게 설정된다는 것을 기억해야함 절대 수퍼 클래스 또는 인터페이스로는 설정되지 않음 예시 open class Animal class Zebra: Animal() fun main() { var animal = Zebra() animal = Animal() } 명시적으로 지정 open class Animal class Zebra: Animal() fun main() { var animal: Animal = Zebra() animal = Animal() } 그러나 직접 라이브러리를 조작할 수 없는 경우에는 이런 문제를 간단하게 해결할 수 없고 이러한 .. 2022. 9. 24. item3 - 최대한 플랫폼 타입을 사용하지 마라 코틀린은 null-safety 매커니즘으로 인해 NPE를 거의 찾아보기 힘듬 null-safety 매커니즘이 없는 자바, C 등의 프로그래밍 언어와 코틀린을 연결해서 사용할 때는 NPE 예외가 발생할 수 있음 public class JavaTest{ public String giveName() { ... } } 위 자바 코드로 반환된 타입을 사용할때에 @Nullable 어노테이션이 붙어 있다면 nullable로 추정하고 String?으로 변경하면 되는데 만약 붙어 있지 않다면 자바에서 모든 것이 nullable일 수 있으므로 최대한 안전하게 접근하기 위해 nullable로 가정하고 접근해야 함 제네릭 타입 public class UserRepo { public List getUsers() { ...} }.. 2022. 9. 24. item2 - 변수의 스코프를 최소화하라 상태를 정의할 때는 변수와 프로퍼티의 소코프를 최소화하는 것이 좋음 프로퍼티보다는 지역 변수 사용 최대한 좁은 스코프를 갖게 되는 변수 사용 요소의 스코프라는 것은 요소를 볼 수 있는 컴퓨터 프로그램 영역 코틀린의 스코프는 기본적으로 중괄호로 만들어지며, 내부 스코프에서 외부 스코프에 있는 요소에만 접근할 수 있음 //안좋은 예시 val a = 1 fun fizz() { val b = 2 println(a + b) } val buzz = { val c = 3 println(a + c) } //변수 스코프를 제한하는 예 val users = listOf() var user: User // 외부/내부 모두 사용할 수 있는 변수 사용 for (i in users.indices) { user = users[i].. 2022. 9. 24. 이전 1 2 다음