일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 의존성역전원칙
- 코틀린 in
- 자바
- 코틀린 노트북
- Convariance
- MySQL
- Mutation testing
- resize image with go
- kotlin
- resizer 구현
- Java
- Pitest
- hugo 로 블로그
- image resizer with go
- cli 만들기
- 코틀린
- 공짜블로그
- standard output
- change refresh rate
- Test
- 돌연변이 테스팅
- standard input
- IntelliJ
- 개인블로그 hugo
- 객체지향
- output stream
- 코틀린 out
- ruby
- JPA
- InnoDB
- Today
- Total
목록Kotlin (48)
Rlog
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..
우리가 코루틴을 사용할때 보통 일정한 값을 기다려야 할때 아래와 같이 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..
Week6 선점형 멀티태스킹 대부분의 OS 는 선점형 멀티태스킹 방식을 취하고 있음. 예를 들면 A 프로세스나 스레드를 스케쥴링 하다가도, B 프로스세스나 스케쥴러가 좀 더 높은 우선순위로 실행되야 한다면, OS 가 A 프로세스를 중단시키고, B 프로세스를 실행시킬 수 있음 비선점형 멀티태스킹 OS 가 강제로 현재 실행중인 프로그램을 멈출 수 없음. 로드된 프로그램이 종료되어야 다른 프로그램이 실행됨. 보통 경량스레드들이 이에 속함. 보통 하나의 로직이 죽으면 전부 다 죽음. 비선점형 멀티태스킹의 단점 단점은 진짜 동시성이 아니다. 하나의 작업을 여러개의 쓰레드나 프로세서로 분산시킬 수 없음. -> 각 작업을 길게 쪼개면 각각 조각을 스레드로 분산시킬 수는 있음. 위의 사진 처럼 하나의 Job 을 잘게 ..
Coroutine Exception Handling Coroutine 의 Exception Handling 은 Coroutine 을 제대로 공부하지 않으면 사용하기 힘들다. 왜냐하면 사용하는 Coroutine Builder 마다 Exception 을 전파하는 방식이 다르기 때문이다. Coroutine Builder 간의 차이 launch 의 경우 Exception 이 발생하게 되면 즉시 Exception 을 위로 전파하는 성질이 있습니다. async 의 경우 Exception 이 발생해도 즉시 전파하지않고, await() 이 실행될때 전파합니다. 사실 이런 부분은 코드로 봐야 조금 더 직관적이므로 코드로 설명하겠습니다. launch launch 의 경우 위에서 설명했듯이 Exception 을 그 즉시 상..
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..
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..
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..
변성 (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) /..