코틀린

Language/Kotlin

async CoroutineBuilder Introduction

이번 글에서는 저번 글에서 빼먹었던 async 코루틴 빌더의 필요성과 어떤 녀석인지 소개해보려고 한다. async CoroutineBuilder 필요성 이해하기대체 이 async라는 코루틴 빌더가 존재하는 이유가 뭘까? 이 빌더를 설명하는 글을 보면 대부분 "결과를 반환받는다" 또는 "실행이 완료되기를 기다릴 수 있다"는 멘트가 적혀있다. 나같은 초급 개발자는 "그게 그렇게 다른점인가?"하고 생각할 수 있다. 뭐 결과를 반환받는 것은 다른 점일 수 있지만,실행이 완료되기를 기다리는 건 launch 코루틴 빌더로도 join() 메소드를 사용하면 가능하기 때문이다. 코드로 launch와 비교해보기어떤 MutableList 원소를 채워넣는 상황이라고 가정해보자. 그리고 두 코드 블럭을 비교해보자. 과연 어떤 ..

Language/Kotlin

Coroutines 기본적인 에러 처리하기(feat. try-catch)

나는 지금까지 예제를 사용하면서 네트워크 작업을 예로 들었다. 게다가 해당 작업이 무조건 정상 동작하는 시나리오로만 공부했다. 만약, 네트워크 작업을 수행할 때 HTTP 500번대와 같은 에러가 발생한다면 어떻게 처리해야할까? 이 에러 상황을 처리하지 않고 앱을 실행하게 되면 바로 크래시가 난다. 그럼 어떡함?제목에서 거의 스포가 되었는데, 정말 간단히 처리하는 방법이 하나 있다. try-catch를 사용하는 것이다. fun performNetworkRequest() { viewModelScope.launch { try { val recentVersions = getRecentVersions() } catch (e: Exception) { e.printStack..

Language/Kotlin

Coroutines의 Main safety

이번 글에서는 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..

Language/Kotlin

Coroutine Builder 이해하기

우리는 지금까지 예제에서 코루틴을 실행할 때 async를 사용해 suspend function을 실행해왔다. 명확히 하자면 이번 제목이 코루틴을 실행하는데 필요한 녀석이다. 그래서 뭐임?Coroutine Builder(코루틴 빌더)는 새로운 코루틴을 만들기 위해 필요한 녀석이다. 총 3가지 빌더가 있고 launch, async, runBlocking이 있다. 먼저 launch를 사용해보려고 한다. launch 사용하기fun main() { launch {}} 단순히 이렇게 사용할 순 없다. launch는 최상위 함수가 아닌 CoroutineScope의 확장함수이기 때문이다. 이렇게 launch를 사용하려면 새로운 CoroutineScope가 필요하다. launch는 대체 어떤 경우에 사용하는 걸까? 코루..

Android

Android UDP 통신해보기 in Kotlin

이번 기능은 사실 이전에 생각조차 해보지 않은 기능이었다. 기존 HTTP, TCP 기반 통신에 익숙해져 있었기 때문이다. 그리고 내가 연동해야할 센서는 0으로 1바이트를 보내면 지속적으로 특정값을 형식에 맞게 보내주는 녀석이었다. 그럼 바로 코드를 공유해보도록 하겠다. private fun fetchUdpData() = CoroutineScope(Dispatchers.Default).launch { println("started fetch") val socket = DatagramSocket() val address = InetAddress.getByName(someIp.split(":")[0]) val packet = DatagramPacket( "0".toByteArray(), "0".toByteAr..

프로그래머스

[PCCE 기출문제] 8번 / 창고 정리 자바(Java)

이 문제가 0레벨 PCCE 기출문제 마지막이다. 사실 몇 번 들어갔다 문제 읽기 귀찮아서 뒤로 가기를 눌렀던 적이 있다 ㅋㅋ 아무튼 마무리를 지어보도록 하자. 문제 물건 종류가 들어있는 배열이 하나 있고, 해당 배열과 1대1로 짝지어진 갯수가 들어있는 배열이 있다. 여기서 우리가 마지막으로 리턴해야 할 값은 물건 종류이다. 그리고 나는 이 문제가 딱 한 줄만 수정해야하는 디버깅 문제인 점이 기억났다. 따라서, 아무런 수정도 하지 않고 먼저 실행해보았더니 결과가 물건 종류가 아닌 갯수가 리턴되고 있었다. 게다가 그 갯수도 총합이 아닌 함수 파라미터로 주어진 num배열 값 중 하나였다. 풀이 주석 아래 코드는 첨부하지 않았는데 말로 요약하자면 이렇다. 간단히 갯수 최댓값에 따라 리턴값을 갱신하는 코드이다. ..

프로그래머스

접미사 배열 코틀린(Kotlin)

오늘은 정답자가 적은 문제 중에 하나로 골라 풀어보았다. 한글로된 문제를 읽었을 때는 살짝 헷갈리는 문제였는데, 입출력 예시와 비교하면서 문제를 제대로 이해하게 됐다. 문제에서는 특정 인덱스부터 시작하는 문자열을 접미사라고 하는데 그냥 모든 인덱스에서 마지막 글자까지 자른 것이 접미사이다. 풀이 먼저 반복문을 사용해 리턴할 배열에 원소를 넣어주기 전에 리턴할 배열의 길이를 정해야 한다. 생각해보면 주어진 문자열의 길이만큼의 숫자가 리턴할 배열의 길이가 된다. 이제 반복문을 사용해 가장 긴 문자열부터 가장 짧은 문자열까지 배열을 채워준다. 그 다음 문제의 요구사항은 해당 배열이 정렬되어 있는 것인데 사전 순으로 정렬이 되어야한다. 보통 사전은 가나다순. 즉, 오름차순이기에 sort() 메소드를 사용했다. ..

Language/Kotlin

Coroutines의 내부 동작

지금까지 코루틴을 공부하면서 보면 이 녀석은 특정 시점에 내 맘대로 멈추고 다시 실행시키는데 이런 동작은 참 신기하다. 그래서 이번 글에서는 코틀린 컴파일러가 내부적으로 어떻게 동작하는지 살펴보겠다. 코틀린 컴파일 과정 사실 이렇게 제목을 달아야할까 싶을 정도로 간단히 적을 내용이다. 자바를 알고 있는 개발자라면 자바가 어떻게 컴파일되는지 알고 있을텐데 코틀린도 유사하다. .kt 확장자를 가진 파일을 코틀린 컴파일러가 .class 확장자인 바이트코드로 변환한다. 이게 끝이다. 바이트코드를 Decompile하면? 대체 뭐가 나올까? .java 파일로 decompile된 코드가 보인다. Android Studio에서 해당 과정을 진행할 수 있는데 Tools - Kotlin - Show Kotlin Bytec..

Language/Kotlin

Coroutines을 다른 스레드에서 실행하기

이번 글은 저번 글 문맥이 살짝 섞여있는데, 간단히 말해 저번 글에서는 코루틴을 메인 스레드에서만 실행했다. 그래서 이번 글에서는 코루틴을 다른 스레드에서 실행해보려고 한다. 다른 스레드에서 코루틴 실행하기 바로 예제를 통해 알아보자. 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..

Language/Kotlin

Blocking vs Suspending 차이점

이번에는 Thread에서 전통적으로 사용하는 sleep(blocking)과 Coroutines에서 사용하는 delay(suspending)의 차이에 대해 적어본다. Thread의 blocking 먼저 스레드로 blocking하는 예시를 보도록 하자. fun main() { println("main starts") threadRoutine(1, 500) threadRoutine(2, 300) Thread.sleep(1000) println("main ends") } fun threadRoutine(number: Int, delay: Long) { thread { println("thread $number starts work") Thread.sleep(delay) println("thread $number..

BonusTrack02.dev
'코틀린' 태그의 글 목록 (3 Page)