![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/dJEvbG/btspRhvxV1o/lCbQ0uXL51eW6BJ2JrgOk1/img.png)
앱 시작 상태 cold start 앱이 처음부터 시작. 앱의 프로세스를 만들지 않는다. 기기가 부팅되거나 시스템에서 앱이 종료되고 난 후 앱이 처음으로 시작되는 경우 등에서 발생한다. 다른 시작 상태보다 더 많은 작업을 실행해야 하므로 시작 시간이 길어질 수 있다. warm start 프로세스가 존재하지만 메모리에 올라오지 않은 경우. 사용자가 앱을 종료한 다음 다시 시작하거나, 시스템이 메모리에서 앱을 제거한 다음 사용자가 앱을 다시 시작하는 경우 등에서 발생한다. hot start 프로세스가 존재하고 메모리에 올라온 경우. 백그라운드에서 실행되고 있다가, 포그라운드로 올라온다. 스플래시 작동 방식 사용자가 스플래시를 직접 지정해주는 경우에는, 메모리에 이미 앱이 존재하는 hot start이어도 스플래..
동시성 통신 채널 fun main() { runBlocking { val streamSize = 5 val channel = Channel(3) launch { for (n in 1..streamSize) { delay(Random.nextLong(100)) println("Sending: $n") channel.send(n) } } launch { for (i in 1..streamSize) { delay(Random.nextLong(100)) val n = channel.receive() println("Receiving: $n") } } } } Thread-safe하게 임의의 데이터 스트림을 코루틴 사이에 공유할 수 있게 해준다. 채널의 용량을 지정하는 정수값을 인자로 받는 Channel() 함수를..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/tVQTr/btsoho4cso4/qbt9cIdWb70nK6AmFEXEAk/img.png)
코루틴 흐름 제어 Job 동시성 작업의 생명 주기를 표현하는 객체 작업 상태를 추적하고, 작업을 취소할 수 있다. 잡은 생성되자마자 시작되므로 Active 상태가 된다. isActive, isCompleted, isCancelled 프로퍼티를 통해 상태를 추적할 수 있다. Cancelled, Completed 상태일 때 isComplete의 프로퍼티 값이 모두 true다. isCancelled을 통해 두 상태를 구분한다. launch(), async()에서 잡의 초기 상태를 지정할 수 있다. CoroutineStart.DEFAULT: 잡을 즉시 시작한다. (default) CoroutineStart.LAZY: 잡을 자동으로 시작하지 않는다. New 상태에서 시작을 기다린다. start() fun main..
![](http://i1.daumcdn.net/thumb/C148x148.fwebp.q85/?fname=https://blog.kakaocdn.net/dn/drlwMJ/btsofppnM5P/lHDEf7uVJtbb6WLPr80kX1/img.png)
코루틴 suspend 함수 suspend fun sum(val1: Int, val2: Int): Int { delay(1000) return val1 + val2 } 함수 실행을 중단한 다음, 나중에 필요할 때 다시 실행을 계속 진행할 수 있는 함수 함수에 suspend라는 키워드를 붙인다. 스레드를 block 시키지 않고 일시 중단하며, 그동안 스레드가 다른 작업을 수행할 수 있다. sum(val1: Int, val2: Int, val3: Continuation) 컴파일 시 마지막 파라미터로 Continuation 객체를 추가한다. Continuation을 통해 중단(suspend) 시점의 실행 정보들을 저장하고, 실행이 다시 재개(resume)되면 저장한 정보를 기반으로 실행을 다시 이어나간다. su..
위임 프로퍼티 1. 표준 위임 lazy() LazyThreadSafeyMode 이넘 상수 값 SYNCHRONIZED: 항상 하나의 스레드에 의해서만 초기화되도록 보장한다. (default) PUBLICATION: 초기화 함수가 여러번 호출될 수 있지만 가장 처음 도착하는 결과가 프로퍼티 값이 된다. NONE: 프로퍼티 접근을 동기화하지 않는다. (가장 빠르며 한 스레드에서만 불린다고 확신할 수 있는 경우) val value1 by lazy { println("Initializing value") 123 } val value2 by lazy(LazyThreadSafeyMode.PUBLICATION) { println("Initializing value") 123 } value1은 default로 SYNCH..
연산자 오버로딩 - +, -, *, / 등 코틀린 내장 연산자에 대해 새로운 의미를 부여할 수 있게 해준다. operator fun String.times(n: Int) = repeat(n) fun main() { println("abc" * 3) // abcabcabc println("abc".times(3)) // abcabcabc } 연산자를 구현하기 위해 함수 앞에 operator 키워드를 붙인다. 1. 단항 연산 enum class Color { BLACK, WHITE, BLUE, YELLOW; operator fun not() = when(this) { BLACK -> WHITE WHITE -> BLACK BLUE -> YELLOW YELLOW -> BLUE } } fun main() { pr..
리플렉션 클래스, 함수, 프로퍼티의 런타임 표현에 접근할 수 있게 해준다. 1. KAnnotatedElement annotation class Component(val name: String = "Core") @Component("I/O") class IO fun main() { val component = IO::class.annotations.first() as Component println("Component name: ${component.name}") // Component name: Log } 가장 상위 리플렉션 타입으로, 모든 리플렉션 타입의 부모가 된다. 함수, 프로퍼티, 클래스 등 요소에 정의된 어노테이션에 접근하는 기능을 제공한다. 어노테이션 인스턴스의 리스트 프로퍼티(annotati..
Annotation 소스코드에 추가할 수 있는 메타데이터 val objects = listOf("1", "2", "3") val s = @Suppress("UNCHECKED_CAST") objects as List 자바와 달리 어노테이션을 식에 적용할 수 있다. @[Synchronized Strictfp] // @Synchronized @Strictfp fun main() { } 어노테이션을 여러개 붙이고 싶다면 []로 어노테이션을 감싼다. class A @MyAnnotation constructor() 어노테이션을 주생성자에 적용하고 싶을 때는 명시적으로 주생성자에 constructor 키워드를 붙인다. 1. 어노테이션 정의 annotation class Dependency(val arg: String..