728x90

분류 전체보기 173

Kotlin Coroutine) Channel

Channel 채널 API 는 Coroutine 간의 상호 통신용으로 사용된다. Coroutine 과 Coroutine 사이에서 Channel 을 이용하여 어떠한 데이터든 주고 받을 수 있다. 특징 채널의 경우 Producer 와 Consumer 갯수에 제한이 없다. Channel 은 아래 두개 interface 를 구현하고 있다. SendChannel ReceivceChannel Receive 가 또는 Send 가 Suspend 되는 경우 Recevice 는 Channel 에서 Element 를 받아오는 함수이다. 근데 만약에 Channel 에 Element 가 없다면 어떻게 될까? 해당 Coroutine 은 가져올 수 있는 Element 가 있을때 까지 suspend 된다. Send 가 Suspend..

Kotlin 2022.07.15

병합정렬(Merge Sort)

병합정렬 Merge Sort 는 Java Collection API 에서도 사용하는 것으로 알고있을 정도로 안전하다. 가끔 왜 Quick Sort 를 쓰지않고, Merge Sort 를 사용하여 구현하는 것에 대한 이야기가 있는데 Quick Sort 를 구현해봤다면 Quick sort 는 stability 하지 않다는 것을 알것이다. 따라서 충분히 objcet 의 경우에 sort 에서 순서가 뒤바뀌는 현상을 경험하기 충분하며 그로인한 사이드 이펙트를 유발할 수 있다. 일단 이 얘기는 뒤로하고 알고리즘에 대해 알아보도록 하자. 도식 나는 이런 Recursive 하게 짜야되는 Algorithm 을 작성할때는 항상 도식을 그리는 편이다. 그래야 Call Stack 생각도 잘나고, 코드도 잘 작성되는 것 같다. ..

Algorithm 2022.07.13

Coroutine withContext 를 이용한 await 처리

우리가 코루틴을 사용할때 보통 일정한 값을 기다려야 할때 아래와 같이 runBlocking 을 이용할 수도 있다. fun test() = runBlocking { launch { // Some Api Calls println("hello, ") } return@runBlocking "ApiCalls Result" } fun main() { println(test()) } 위와 같이 작성하면 어떻게 될까? runBlocking 에서 한가지 알아야 할 점이 있는데, runBlocking 은 처음에 자신만의 Thread 를 고정시켜버린다. 따라서 아래와 같이 Thread 이름을 출력하는 형태로 코드를 작성해서 확인해보면 결과는 아래와 같다. fun test() = runBlocking { launch { pr..

Kotlin 2022.07.11

코드스피츠 6강) 코루틴

Week6 선점형 멀티태스킹 대부분의 OS 는 선점형 멀티태스킹 방식을 취하고 있음. 예를 들면 A 프로세스나 스레드를 스케쥴링 하다가도, B 프로스세스나 스케쥴러가 좀 더 높은 우선순위로 실행되야 한다면, OS 가 A 프로세스를 중단시키고, B 프로세스를 실행시킬 수 있음 비선점형 멀티태스킹 OS 가 강제로 현재 실행중인 프로그램을 멈출 수 없음. 로드된 프로그램이 종료되어야 다른 프로그램이 실행됨. 보통 경량스레드들이 이에 속함. 보통 하나의 로직이 죽으면 전부 다 죽음. 비선점형 멀티태스킹의 단점 단점은 진짜 동시성이 아니다. 하나의 작업을 여러개의 쓰레드나 프로세서로 분산시킬 수 없음. -> 각 작업을 길게 쪼개면 각각 조각을 스레드로 분산시킬 수는 있음. 위의 사진 처럼 하나의 Job 을 잘게 ..

Kotlin 2022.07.07

코루틴 빌더 예외처리

Coroutine Exception Handling Coroutine 의 Exception Handling 은 Coroutine 을 제대로 공부하지 않으면 사용하기 힘들다. 왜냐하면 사용하는 Coroutine Builder 마다 Exception 을 전파하는 방식이 다르기 때문이다. Coroutine Builder 간의 차이 launch 의 경우 Exception 이 발생하게 되면 즉시 Exception 을 위로 전파하는 성질이 있습니다. async 의 경우 Exception 이 발생해도 즉시 전파하지않고, await() 이 실행될때 전파합니다. 사실 이런 부분은 코드로 봐야 조금 더 직관적이므로 코드로 설명하겠습니다. launch launch 의 경우 위에서 설명했듯이 Exception 을 그 즉시 상..

Kotlin 2022.07.07

CoroutineScope 과 Runblocking 의 차이

CoroutineScope VS Runblocking Kotlin Coroutines 을 학습했다면 위와 같은 고민을 하고 있을 가능성이 높다고 생각한다. 도대체 둘의 차이는 무엇일까? 일단 아래 예시 코드를 한번 보자. // 1번 코드 fun main() = runBlocking { val a = coroutineScope { delay(3000) 10 } println("a is calculated") val b = coroutineScope { delay(3000) 20 } println(a) // 10 println(b) // 20 } // 2번 코드 fun main() = runBlocking { val a = runBlocking { delay(5000) 10 } println("a is ca..

Kotlin 2022.07.05

Kotlin Coroutine Exception Handling

Exception Handling 앞에서도 말했듯 Coroutine 에는 Structured Concurrency 개념이 존재해서, Children 에서 Exception 이 전파될 경우 부모 또한 취소된다고 말했었다. 그래서 우리는 부모까지 uncaught Exception 이 전파되어서 취소되는 상황을 막아야 한다면, Exception 을 Handling 해야만 한다. Exception Handling 방법 가장 무난하게는 Try...Catch 를 사용하는 방법이 있을 수 있다. 참고로 아래 코드 처럼 launch 를 try..catch 로 덮는것은 아무의미가 없다. fun main(): Unit = runBlocking { try { launch { delay(1000) throw Error("So..

Kotlin 2022.07.05

Kotlin Coroutine Job

Jobs 코루틴에서 Job 이란 무엇일까? 컨셉적으로는 LifeCycle 에서 취소될 수 있는 것을 뜻한다. Job 을 알아야 하는 이유는 내가 알기론, 모든 ㄴKotlin Coroutines Library 를 이용해 만든 CoroutineBuilders 는 Job 을 만든다. Deffered 또한 Job Interface 를 상속하고 있다. Structured Concurrency Job 또한 코틀린의 기본원칙인 Structured Concurrency 를 따른다. 만약, Structured Concurrency 를 모른다면, 다시 이전포스트를 공부하고 오는게 좋다. 하여튼, 그래서 아래 Job 이 취소되거나, 부모 Job 이 취소될 경우 그 Scope 는 Cancel 될 것이다. Job LifeCyc..

Kotlin 2022.07.01

Kotlin) 변성

변성 (Variance) Generic Type 의 대체 가능성을 정의 (무공변, 반공변, 공변), 변성은 Genrice Parameter Type 간의 관계를 나타낼때 쓰이는 단어임. 무공변(invariance) Generic 의 Parameter Type 은 각각 고유하므로 GenericType 사이의 대체 가능성은 기본적으로 성립하지 않음. 이 상태가 무공변(invariance) 상태임. 이 말을 듣고 느낀 점은, 지금 까지 Generic Parameter 에 넣는 Type 을 자꾸, 내가 생성한 Class 들의 상속관계로 가져와서 생각하다보니, 공변을 한동안 이해하기 어려웠던 건가? 이런 생각이 들었다. class Tree(val value: T) var tree: Tree = Tree(10) /..

Kotlin 2022.06.30

Coroutine Builder

CoroutineBuilder Kotlin 에서 Suspend function 은 normal function 에서 호출할 수 없다. Suspend Function 은 오로지 Suspend Function 에서만 호출되어야 한다. 하지만 우리가 Suspend 를 사용해야 하는데, 모든 함수가 suspend 일 수 있을까? 적어도 main(프로그램 진입점) 은 suspend 하지 않을 수 있다. 그래서 코틀린은 suspend scope 를 만들 수 있도록 corutineBuilder 를 제공한다. 대표적으로 제공하는 세가지 corutineBuilder (launch, runBlocking, async) 에 대해 공부해보자. launch builder launch builder 는 concept 적으로 새로..

Kotlin 2022.06.27
728x90