이번 글에서는 저번 글에서 빼먹었던 async 코루틴 빌더의 필요성과 어떤 녀석인지 소개해보려고 한다. async CoroutineBuilder 필요성 이해하기대체 이 async라는 코루틴 빌더가 존재하는 이유가 뭘까? 이 빌더를 설명하는 글을 보면 대부분 "결과를 반환받는다" 또는 "실행이 완료되기를 기다릴 수 있다"는 멘트가 적혀있다. 나같은 초급 개발자는 "그게 그렇게 다른점인가?"하고 생각할 수 있다. 뭐 결과를 반환받는 것은 다른 점일 수 있지만,실행이 완료되기를 기다리는 건 launch 코루틴 빌더로도 join() 메소드를 사용하면 가능하기 때문이다. 코드로 launch와 비교해보기어떤 MutableList 원소를 채워넣는 상황이라고 가정해보자. 그리고 두 코드 블럭을 비교해보자. 과연 어떤 ..
나는 지금까지 예제를 사용하면서 네트워크 작업을 예로 들었다. 게다가 해당 작업이 무조건 정상 동작하는 시나리오로만 공부했다. 만약, 네트워크 작업을 수행할 때 HTTP 500번대와 같은 에러가 발생한다면 어떻게 처리해야할까? 이 에러 상황을 처리하지 않고 앱을 실행하게 되면 바로 크래시가 난다. 그럼 어떡함?제목에서 거의 스포가 되었는데, 정말 간단히 처리하는 방법이 하나 있다. try-catch를 사용하는 것이다. fun performNetworkRequest() { viewModelScope.launch { try { val recentVersions = getRecentVersions() } catch (e: Exception) { e.printStack..
이번 글에서는 Coroutines가 어떻게 main-safety하게 동작하는 지에 대해 설명해보려한다. 먼저 안드로이드 ViewModelScope에서 실행되는 코루틴은 기본적으로 main thread에서 실행된다. 이는 매우 합리적인 이유가 있는데 우리는 ViewModel에서 UI 관련 작업을 자주 수행하기 때문이다. 우리가 ViewModel에서 아래와 같은 함수를 실행한다고 가정해보자.fun performNetworkRequest() { viewModelScope.launch { val recentVersions = getVersions() // this is a suspend function }} 이렇게 네트워크 작업을 Retrofit으로 수행할 때, main thread blocking..
우리는 지금까지 예제에서 코루틴을 실행할 때 async를 사용해 suspend function을 실행해왔다. 명확히 하자면 이번 제목이 코루틴을 실행하는데 필요한 녀석이다. 그래서 뭐임?Coroutine Builder(코루틴 빌더)는 새로운 코루틴을 만들기 위해 필요한 녀석이다. 총 3가지 빌더가 있고 launch, async, runBlocking이 있다. 먼저 launch를 사용해보려고 한다. launch 사용하기fun main() { launch {}} 단순히 이렇게 사용할 순 없다. launch는 최상위 함수가 아닌 CoroutineScope의 확장함수이기 때문이다. 이렇게 launch를 사용하려면 새로운 CoroutineScope가 필요하다. launch는 대체 어떤 경우에 사용하는 걸까? 코루..
지금까지 코루틴을 공부하면서 보면 이 녀석은 특정 시점에 내 맘대로 멈추고 다시 실행시키는데 이런 동작은 참 신기하다. 그래서 이번 글에서는 코틀린 컴파일러가 내부적으로 어떻게 동작하는지 살펴보겠다. 코틀린 컴파일 과정 사실 이렇게 제목을 달아야할까 싶을 정도로 간단히 적을 내용이다. 자바를 알고 있는 개발자라면 자바가 어떻게 컴파일되는지 알고 있을텐데 코틀린도 유사하다. .kt 확장자를 가진 파일을 코틀린 컴파일러가 .class 확장자인 바이트코드로 변환한다. 이게 끝이다. 바이트코드를 Decompile하면? 대체 뭐가 나올까? .java 파일로 decompile된 코드가 보인다. Android Studio에서 해당 과정을 진행할 수 있는데 Tools - Kotlin - Show Kotlin Bytec..
이번 글은 저번 글 문맥이 살짝 섞여있는데, 간단히 말해 저번 글에서는 코루틴을 메인 스레드에서만 실행했다. 그래서 이번 글에서는 코루틴을 다른 스레드에서 실행해보려고 한다. 다른 스레드에서 코루틴 실행하기 바로 예제를 통해 알아보자. fun main() = runBlocking { println("main starts") joinAll( async { threadSwitchingCoroutine(1, 500) }, async { threadSwitchingCoroutine(2, 300) } ) println("main ends") } suspend fun threadSwitchingCoroutine(number: Int, delay: Long) { println("Coroutine $number sta..
코루틴 개념에 관한 글을 보면 다들 코루틴은 경량 스레드(light-weight threads)라고 소개하고 있다. 그런데 사실 코루틴을 처음 공부하는 사람이라면 이 문장은 잘 와닿지 않는다. 그냥 그렇구나.. 하고 넘어가긴 했지만 제대로 이해한 적은 없다. 개념적으로도 그렇지만 실제로 코루틴이 스레드보다 가벼운지도 궁금했다. 그래서 이번 글에서는 코루틴이 실제로 스레드보다 가볍다는 사실을 코드와 실행 결과로 기록해보려 한다. 코루틴 100만개 실행하기 fun main() = runBlocking { repeat(1_000_000) { launch { delay(5000) println(".") } } } 이 코드를 실행하면 정말 "."이 백만개 찍힌다. 그럼 이제 같은 코드를 스레드로 실행시켜보자. 스..
suspend function은 다른 suspend function이나 Coroutine에서만 호출될 수 있다. 일반적인 코드에서 suspend function을 호출하려면 새 코루틴을 시작해야한다. 이렇게 만들어진 코루틴에서는 suspend function과 일반 함수를 모두 호출할 수 있다. suspend fun someMethod(delay: Long) { println("starts method") delay(delay) println("ends method") } 위 함수에서 suspend function이 실제로 suspend될 수 있는 지점은 어디일까? 바로 delay() 부분인데 더 길고 복잡한 suspend function이 있다면 그 함수가 포함하고 있는 모든 suspend funct..
먼저 최근에 프로그래머스 거의 문제 풀이글만 올리다 Kotlin에 대해 소개를 할까 생각이 들었다. 프로그래머스 문제를 해결하면서 필요한 메소드나 확장 함수 등을 사용하려고 할 때 나는 주로 코틀린 공식 홈페이지에서 Docs를 찾는 편인데 기본기가 모자라 가끔 알아볼 수 없는 것들이 몇 개 있기 때문이다. 위 제목은 내가 몇몇 회사를 지원하면서 직접 받은 질문 중 하나이기도 하다. 일단, 나는 안드로이드 직군을 희망하고 있는 상태이므로 안드로이드에서 코틀린을 사용할 때의 장점을 적어보려 한다. 시작해보겠다. 1. 가독성이 좋은 적은 코드 사용 이건... 딱히 설명이 구체적이지 않아 스킵... 2. 성숙한 언어와 환경(직역) 2011년에 만들어진 후, 코틀린은 언어뿐만 아니라 전체 생태계까지 지속적으로 개..